介绍
小编这次要给大家分享的是python如何使用事件对象asyncio.Event来同步协程,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
事件对象asyncio.Event是基于线程。事件来实现的。
事件可以一个信号触发多个协程同步工作,
例子如下:
进口asyncio 进口functools def set_event(事件): 打印(& # 39;设置事件回调,) event.set () 异步def coro1(事件): 打印(& # 39;coro1等待事件# 39;) 等待event.wait () 打印(& # 39;coro1触发# 39;) 异步def coro2(事件): 打印(& # 39;coro2等待事件# 39;) 等待event.wait () 打印(& # 39;coro2触发# 39;) 异步def主要(循环): #创建一个共享的活动 事件=asyncio.Event () 打印(& # 39;事件开始状态:{}& # 39;.format (event.is_set ())) loop.call_later ( 0.1,functools。部分(set_event、事件) ) 等待asyncio.wait ([coro1(事件),coro2(事件))) 打印(& # 39;事件最终状态:{}& # 39;.format (event.is_set ())) event_loop=asyncio.get_event_loop () 试一试: event_loop.run_until_complete(主(event_loop)) 最后: event_loop.close ()
输出如下:
进口asyncio 进口functools 导入日志 导入系统 消息=[ b # 39;这是消息。& # 39; b # 39;它将发送& # 39; b # 39;在本市部分# 39; ] SERVER_ADDRESS=(& # 39; localhost # 39;, 10000) 类EchoClient (asyncio.Protocol): def __init__(自我,消息,未来): super () . __init__ () 自我。消息=消息 自我。日志=logging.getLogger (& # 39; EchoClient& # 39;) 自我。f=未来 def connection_made(自我、运输): 自我。运输=运输 自我。地址=transport.get_extra_info (& # 39; peername& # 39;) self.log.debug ( & # 39;连接端口{}{}& # 39;.format (* self.address) ) 除了#这可能是transport.writelines () #将很难显示每个消息的一部分 #被发送。 对味精self.messages: transport.write(味精) self.log.debug(& # 39;发送{! r} & # 39; .format(味精)) 如果transport.can_write_eof (): transport.write_eof () def data_received(自我、数据): self.log.debug(& # 39;收到{! r} & # 39; .format(数据) def eof_received(自我): self.log.debug(& # 39;收到eof # 39;) self.transport.close () 如果不是self.f.done (): self.f.set_result(真正的) def connection_lost(自我,exc): self.log.debug(& # 39;服务器关闭连接,) self.transport.close () 如果不是self.f.done (): self.f.set_result(真正的) 超级().connection_lost (exc) logging.basicConfig (=logging.DEBUG水平, 格式=& # 39;%(名称):% & # 39;(消息), 流=sys.stderr, ) 日志=logging.getLogger(& # 39;主要# 39;) event_loop=asyncio.get_event_loop () client_completed=asyncio.Future () client_factory=functools.partial ( EchoClient, 消息=消息, 未来=client_completed, ) factory_coroutine=event_loop.create_connection ( client_factory, * SERVER_ADDRESS, ) log.debug(& # 39;等待客户端不能# 39;) 试一试: event_loop.run_until_complete (factory_coroutine) event_loop.run_until_complete (client_completed) 最后: log.debug(& # 39;关闭事件循环# 39;) event_loop.close ()python如何使用事件对象asyncio.Event来同步协程