是的,事件循环中运行的任何协程将阻止其他协程和任务运行,除非它
这是因为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()