关于 asyncio 的常见误解

大概了解 asnycio 最常见的误解是,它可以让你运行任何并行的任务 -回避的 GIL(全局解释锁),因此并行执行阻塞作业(在单独的线程)。它没有

asyncio(以及与 asyncio 协作构建的库)构建在协同程序上:(协作)将控制流返回给调用函数的函数。请注意以上示例中的 asyncio.sleep。这是一个非阻塞协程的例子,它在后台等待,并将控制流程返回给调用函数(当用 await 调用时)。time.sleep 是阻塞功能的一个例子。程序的执行流程将停在那里,只有在 time.sleep 完成后才会返回。

一个真实的例子是 requests 库,它仅包含阻塞函数(暂时)。如果你在 asyncio 中调用它的任何函数,就没有并发性。 aiohttp ,另一方面是充分考虑 asyncio 建。它的协同程序将同时运行。

  • 如果你有长时间运行的 CPU 绑定任务,你想并行运行 asyncio 适合你。因为你需要 threadsmultiprocessing

  • 如果你正在运行 IO 绑定作业,则可以使用 asyncio 同时运行它们。