是的,事件循环中运行的任何协程将阻止其他协程和任务运行,除非它
- 使用
yield from
或await
(如果使用Python 3.5+)调用另一个协程。 - 退货。
这是因为
asyncio是单线程的。事件循环运行的唯一方法是没有其他协程正在积极执行。使用
yieldfrom/
await暂时暂停协程,使事件循环有工作的机会。
您的示例代码很好,但是在很多情况下,您可能不希望开始时没有在事件循环内运行不执行异步I /
O的长时间运行的代码。在这些情况下,通常更适合
asyncio.loop.run_in_executor在后台线程或进程中运行代码。
ProcessPoolExecutor如果您的任务是CPU限制的,则是更好的选择;如果您
ThreadPoolExecutor需要执行一些
asyncio不友好的I
/ O ,则将使用它。
例如,您的两个循环完全受CPU限制,并且不共享任何状态,因此,最好的性能来自
ProcessPoolExecutor于跨CPU并行运行每个循环:
import asynciofrom concurrent.futures import ProcessPoolExecutorprint('running async test')def say_boo(): i = 0 while True: print('...boo {0}'.format(i)) i += 1def say_baa(): i = 0 while True: print('...baa {0}'.format(i)) i += 1if __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()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)