@async线程池,python async 多线程

  @async线程池,python async 多线程

  同步线程中使用的run_in_executor,正如其方法名所示,将协同例程放入一个执行器中,要么放在线程池中,要么放在进程池中。也可以使用run_coroutine_threadsafe在其他线程中执行coroutine(这是线程安全的)。

  多线程

  defstart_loop(循环):

  asyncio.set_event_loop(循环)

  loop.run_forever()

  defshutdown(循环):

  loop.stop()

  asyncdefb1():

  new _ loop=asyncio . new _ event _ loop()

  t=线程(target=start_loop,args=(new_loop,))

  启动()

  future=asyncio . run _ coroutine _ thread safe(a(),new_loop)

  打印(未来)

  print(f result : { future . result(time out=2)} )

  new_loop . call _ soon _ threadsafe(partial(shut down,new _ loop))

  In:awaitb1()

  future at0x 107 EDF 4 E0 state=待定

  结果: a这里面有几个细节要注意:

  协程应该从另一个线程调用,而不是从运行事件循环的线程调用,所以用asyncio.new_event_loop()创建一个新的事件循环

  在执行协程之前,确保新创建的事件循环正在运行,因此需要以类似start_loop的方式启动循环。

  然后可以使用asyncio . run _ coroutine _ threadsafe来执行coroutine A,它返回一个Future对象。

  你可以通过输出感觉到未来一开始是待定的,因为在协同学a中睡眠1秒后才会返回结果。

  可以用future.result(timeout=2)得到结果。将timeout的值设置为大于协同进程的执行时间,否则将引发TimeoutError。

  我们在开始时创建的新事件循环在一个线程中运行。由于loop.run_forever会阻止程序关闭,我们需要在最后杀死线程,所以我们使用call_soon_threadsafe回调函数shutdown来停止事件循环。

  再来说说call_soon_threadsafe。从它的名字就能看出来,它是call_soon的线程安全版本,实际上是在另一个线程中调度回调。BTW,其实asyn CIO . run _ coroutine _ threadsafe的底层也用。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: