您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使用python的asyncio模块正确创建和运行并发任务?

如何使用python的asyncio模块正确创建和运行并发任务?

是的,事件循环中运行的任何协程将阻止其他协程和任务运行,除非它

这是因为asyncio是单线程的。事件循环运行的唯一方法是没有其他协程正在积极执行。使用yield from/await暂时暂停协程,使事件循环有工作的机会。

您的示例代码很好,但是在很多情况下,您可能不希望开始时没有在事件循环内运行不执行异步I / O的长时间运行的代码在这些情况下,通常更适合asyncio.loop.run_in_executor后台线程或进程中运行代码ProcessPoolExecutor如果您的任务是cpu限制的,则是更好的选择;如果您ThreadPoolExecutor需要执行一些asyncio不友好的I / O ,则将使用它。

例如,您的两个循环完全受cpu限制,并且不共享任何状态,因此,最好的性能来自ProcessPoolExecutor于跨cpu并行运行每个循环:

import asyncio
from concurrent.futures import ProcessPoolExecutor

print('running async test')

def say_boo():
    i = 0
    while True:
        print('...boo {0}'.format(i))
        i += 1


def say_baa():
    i = 0
    while True:
        print('...baa {0}'.format(i))
        i += 1

if __name__ == "__main__":
    executor = ProcessPoolExecutor(2)
    loop = asyncio.get_event_loop()
    boo = asyncio.create_task(loop.run_in_executor(executor, say_boo))
    baa = asyncio.create_task(loop.run_in_executor(executor, say_baa))

    loop.run_forever()
python 2022/1/1 18:34:39 有216人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶