關於 asyncio 的常見誤解
大概的瞭解 asnycio
最常見的誤解是,它可以讓你執行任何並行的任務 -迴避的 GIL(全域性解釋鎖),因此並行執行阻塞作業(在單獨的執行緒)。它沒有 !
asyncio
(以及與 asyncio
協作構建的庫)構建在協同程式上:(協作)將控制流返回給呼叫函式的函式。請注意以上示例中的 asyncio.sleep
。這是一個非阻塞協程的例子,它在後臺等待,並將控制流程返回給呼叫函式(當用 await
呼叫時)。time.sleep
是阻塞功能的一個例子。程式的執行流程將停在那裡,只有在 time.sleep
完成後才會返回。
一個真實的例子是 requests
庫,它僅包含阻塞函式(暫時)。如果你在 asyncio
中呼叫它的任何函式,就沒有併發性。 aiohttp
,另一方面是充分考慮 asyncio
建。它的協同程式將同時執行。
-
如果你有長時間執行的 CPU 繫結任務,你想並行執行
asyncio
不適合你。因為你需要threads
或multiprocessing
。 -
如果你正在執行 IO 繫結作業,則可以使用
asyncio
同時執行它們。