知行编程网知行编程网  2022-11-15 17:30 知行编程网 隐藏边栏  59 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于深究Python中的asyncio库-线程池的相关知识,希望可以帮到处于编程学习途中的小伙伴

在同步线程中使用的run_in_executor就如它方法的名字所示,把协程放到了一个执行器里面,可以在一个线程池,也可以在一个进程池。另外还可以使用run_coroutine_threadsafe在其他线程执行协程(这是线程安全的)。

深入了解 Python 中的 asyncio 库——线程池


多线程

def start_loop(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()
def shutdown(loop):
    loop.stop()
async def b1():
    new_loop = asyncio.new_event_loop()
    t = Thread(target=start_loop, args=(new_loop,))
    t.start()
    future = asyncio.run_coroutine_threadsafe(a(), new_loop)
    print(future)
    print(f'Result: {future.result(timeout=2)}')
    new_loop.call_soon_threadsafe(partial(shutdown, new_loop))
In : await b1()
<Future at 0x107edf4e0 state=pending>
Result: A


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

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

确保新创建的事件循环在执行协程之前正在运行,因此你需要使用 start_loop 之类的东西来启动循环

接着就可以用asyncio.run_coroutine_threadsafe执行协程a了,它返回了一个Future对象

通过输出可以感觉到一开始future是pending的,因为协程a会在返回结果之前休眠1秒

使用future.result(timeout=2)获取结果,设置timeout的值大于协程的执行时间,否则会抛出TimeoutError

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

让我们在这里再次谈谈 call_soon_threadsafe。从名字可以看出它是 call_soon 的线程安全版本,实际上是在另一个线程中调度回调。 BTW,其实asyncio.run_coroutine_threadsafe的底层也用到了。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享