1.Event类,事件主要用于Greenlet之间的异步通信
e = gevent.event.Event() -> Event
说明: 创建一个信号对象
e.set() -> None
说明: 设置标志位
e.clear() -> None
说明: 清除标志位
e.wait() -> None
说明: 阻塞直至标志位被设置
扩展:
a = gevent.event.AsyncResult() -> AsyncResult
说明: 创建一个扩展可携带数据的信号对象
a.set(value=None) -> None
说明: 设置带数据的标志位
a.e.clear() -> None
说明: 清除带数据的标志位
a.get(block=True, timeout=None) -> obj
说明: 阻塞直至标志位被设置并返回value值,可设置timeout到点抛出Timeout异常
#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)
])