@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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。