python如何使用事件对象asyncio.Event来同步协程

  介绍

小编这次要给大家分享的是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来同步协程