10.5.7.2 事件
asyncio.Event基于threading.Event。它允许多个消费者等待某个事件发生,而不必寻找一个特定值与通知关联。
import asyncio
import functools
def set_event(event):
print('setting event in callback')
event.set()
async def coro1(event):
print('coro1 waiting for event')
await event.wait()
print('coro1 triggered')
async def coro2(event):
print('coro2 waiting for event')
await event.wait()
print('coro2 triggered')
async def main(loop):
# Create a shared event.
event = asyncio.Event()
print('event start state:{}'.format(event.is_set()))
loop.call_later(
0.1,functools.partial(set_event,event)
)
await asyncio.wait([coro1(event),coro2(event)])
print('event end state:{}'.format(event.is_set()))
event_loop = asyncio.get_event_loop()
try:
event_loop.run_until_complete(main(event_loop))
finally:
event_loop.close()
与Lock一样,coro1()和coro2()会等待设置事件。区别是一旦事件状态改变,它们便可以立即启动,并且它们不需要得到事件对象上的唯一的锁。
运行结果: