关于 asyncio 的常见误解
大概的了解 asnycio
最常见的误解是,它可以让你运行任何并行的任务 -回避的 GIL(全局解释锁),因此并行执行阻塞作业(在单独的线程)。它没有 !
asyncio
(以及与 asyncio
协作构建的库)构建在协同程序上:(协作)将控制流返回给调用函数的函数。请注意以上示例中的 asyncio.sleep
。这是一个非阻塞协程的例子,它在后台等待,并将控制流程返回给调用函数(当用 await
调用时)。time.sleep
是阻塞功能的一个例子。程序的执行流程将停在那里,只有在 time.sleep
完成后才会返回。
一个真实的例子是 requests
库,它仅包含阻塞函数(暂时)。如果你在 asyncio
中调用它的任何函数,就没有并发性。 aiohttp
,另一方面是充分考虑 asyncio
建。它的协同程序将同时运行。
-
如果你有长时间运行的 CPU 绑定任务,你想并行运行
asyncio
不适合你。因为你需要threads
或multiprocessing
。 -
如果你正在运行 IO 绑定作业,则可以使用
asyncio
同时运行它们。