gevent模块学习(一)
#coding:utf-8 # 1 事件 event
# 是一个在Greenlet之间异步通信的形式
import gevent
from gevent.event import Event evt = Event() # evt.set() 设置flag
# evt.clear() 清除
# evt.wait() 阻塞等待 def setter():
print('wait for ')
evt.rawlink(event_callback) # 注册一个回调
gevent.sleep(3)
print('ok done')
evt.set() def waiter():
print('will wait for u')
evt.wait()
print('about time') def event_callback(evt):
print('callback') def main():
gevent.joinall([
gevent.spawn(setter),
gevent.spawn(waiter),
gevent.spawn(waiter),
gevent.spawn(waiter),
gevent.spawn(waiter),
gevent.spawn(waiter),
]) if __name__ == "__main__":
main()
# coding:utf-8 import gevent import time
from gevent import event # 调用gevent的event子模块 # 三个进程需要定义三个事件event1,event2,event3,来进行12,23,31循环机制,即进程一,进程二,进程三顺序执行 def fun1(num, event1, event2): # 固定格式 i = 0 while i < 10: # 设置循环10次 i += 1 time.sleep(1) # 睡眠1秒 print'进程一:111111111' event2.set() # 将event2值设为True event1.clear() # 将event1值设为False event1.wait() # event1等待,其值为True时才执行 def fun2(num, event2, event3):
i = 0 while i < 10:
i += 1 time.sleep(1) print'进程二:222222222' event3.set() # 将event3值设为True event2.clear() # 将event2值设为False event2.wait() # event2等待,其值为True时才执行 def fun3(num, event3, event1):
i = 0 while i < 10:
i += 1 time.sleep(1) print'进程三:333333333' event1.set() # 将event1的值设为True event3.clear() # 将event3的值设为False event3.wait() # event3 等待,值为True时才执行 if __name__ == "__main__": # 执行调用格式 act1 = gevent.event.Event() # 调用event中的Event类,用act1表示 act2 = gevent.event.Event() act3 = gevent.event.Event() # 三个进程,act1,act2,act3 Gevents = [] # 建立一个数列,用来存和管理进程 g = gevent.Greenlet(fun1, 1, act1, act2) # 调用gevent中的Greenlet子模块,用Greenlet创建进程一 g.start() print'进程一启动:' Gevents.append(g) # 将进程一加入到Gevents数列
g = gevent.Greenlet(fun2, 2, act2, act3) g.start() print'进程二启动:' Gevents.append(g)
g = gevent.Greenlet(fun3, 3, act3, act1) g.start() print'进程三启动:' print'所有进程都已启动!' Gevents.append(g)
gevent.joinall(Gevents) # 调用Greenlet中的joinall函数,将Gevents的进程收集排列
# coding:utf-8
# AsyncResult 允许你在唤醒调用上附加一个值,有时也被称作future或defered 因为它持有一个指向将来任意时间可设置为任何值的引用 import gevent
from gevent.event import AsyncResult
a = AsyncResult() # a.set(value=None)
# a.clear()
# a.get(block=True, timeout=None) 阻塞直至标志位被设置并返回value值, 可设置timeout def setter():
gevent.sleep(2)
a.set('aaaa') def waiter():
print(a.get(timeout=5)) gevent.joinall([
gevent.spawn(setter),
gevent.spawn(waiter)
])
gevent模块学习(一)的更多相关文章
- gevent模块学习(四)
gevent.spawn会对传入的子任务集合进行调度,gevent.joinall 方法会阻塞当前程序,除非所有的greenlet都执行完毕,才会退出程序 公有方法 gevent.spawn(cls, ...
- gevent模块学习(三)
3. Group类,常用于不限制数量的管理异步任务的分组且可搜集运行结果 g = gevent.pool.Group(*args) -> Group 说明: 创建一个组对象,其实就是一个不限gr ...
- gevent模块学习(二)
2. Queue类,常用用于Greenlet之间的异步共享 q = gevent.queue.Queue(maxsize=None, items=None) -> Queue 说明: 创建一个指 ...
- python 全栈开发,Day43(引子,协程介绍,Greenlet模块,Gevent模块,Gevent之同步与异步)
昨日内容回顾 I/O模型,面试会问到I/O操作,不占用CPU.它内部有一个专门的处理I/O模块.print和写log 属于I/O操作,它不占用CPU 线程GIL保证一个进程中的多个线程在同一时刻只有一 ...
- Python之路(第四十七篇) 协程:greenlet模块\gevent模块\asyncio模块
一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程,最大的区别在于 ...
- 协程介绍, Greenlet模块,Gevent模块,Genvent之同步与异步
昨日内容回顾 I/O模型,面试会问到I/O操作,不占用CPU.它内部有一个专门的处理I/O模块.print和写log 属于I/O操作,它不占用CPU 线程GIL保证一个进程中的多个线程在同一时刻只有一 ...
- python全栈开发,Day43(引子,协程介绍,Greenlet模块,Gevent模块,Gevent之同步与异步)
昨日内容回顾 I/O模型,面试会问道 I/O操作,不占用CPU,它内部有一个专门的处理I/O模块 print和写log属于I/O操作,它不占用CPU 线程 GIL保证一个进程中的多个线程在同一时刻只有 ...
- 协程--gevent模块(单线程高并发)
先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...
- Day5 - Python基础5 常用模块学习
Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...
随机推荐
- python中split()的用法
Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串. 语法: str.split(str="", num=str ...
- 写SQL语句常见的问题
1.从一个表1查询的数据作为另一个表2的部分记录插入表2中 如果是固定值,直接再列5后面列出即可INSERT INTO 表1 (列1, 列2,列3, 列4, 列5,列6) SELECT 列1, 列2, ...
- P4177 [CEOI2008]order(网络流)最大权闭合子图
P4177 [CEOI2008]order 如果不能租机器,这就是最大权闭合子图的题: 给定每个点的$val$,并给出限制条件:如果取点$x$,那么必须取$y_1,y_2,y_3......$,满足$ ...
- linux和windows下icmp的区别
实验方式:先从linux虚拟机ping windows主机,然后从windows主机ping linux虚拟机,在pc上采用wireshark抓包. 如下(只保留了关键信息) 可以看到linux发出的 ...
- 关于Java多线程的一些常考知识点
前言 Java多线程也是面试中经常会提起到的一个点.面试官会问:实现多线程的两种方式以及区别,死锁发生的4个条件以及如何避免发生死锁,死锁和活锁的区别,常见的线程池以及区别,怎么理解有界队列与无界队列 ...
- Django视图层
本文目录 1 视图函数 2 HttpRequest对象 3 HttpResponse对象 4 JsonResponse 5 CBV和FBV 6 简单文件上传 回到目录 1 视图函数 一个视图函数,简称 ...
- Linux下复制文件
命令: cp -Rf /文件名1/* /文件名2 把文件夹1下的文件复制到文件2中(/* 表示复制文件夹1下的文件,不复制文件夹1)
- MySql 8.0 C#连接报错 MySql.Data.MySqlClient.MySqlException (0x80004005): Authentication to host '12.118.224.181' for user 'root' using method 'caching_sha2_password' failed with message: Reading from t
解决方法 在连接字符串后面加上 SslMode=None
- canvas与svg
canvas与svg都是用于在网页上绘制图形(位图). canvas是HTML5新出来的一个标签,用来定义一块画图的区域(canvas本身没有绘制能力),用JavaScript来画图,可以绘制路径.矩 ...
- 清华源和中科大源都停止对Anaconda的支持之后,换腾讯云镜像的方法
直接下载下面的文件解压后放在用户文件夹下即可,windows为"C:\用户\你的用户名\",Linux为"/home/你的用户名/"即用户主目录下. 点我下载 ...