對於IO負載,有且僅有兩個理由使用基於asyncio的併發而不是基於多線程的併發:
1. Asyncio爲搶佔式多任務(線程)提供了一個更安全的替代方案,避免了某些程序中的bugs、競態條件和其它未知風險;
2. Asyncio提供了一種簡單的方法來同時支持成千上萬個socket鏈接,包括長鏈接或處理物聯網應用程序的MQTT(消息隊列遙測傳輸)。數據庫
對於Asyncio有幾個誤區:
1. 「Asyncio會使你編寫的程序運行地很是快」,事實是多線程比協程跑的快一點,協程能夠同時運行不少socket鏈接,操做系統每每限制了線程的數量,雖然能夠經過修改配置來支持更多的線程,但不如協程簡單;
2. 「Asyncio使多線程變得多餘」,徹底錯誤,asyncio不受GIL的影響僅僅是由於GIL影響多線程程序,其阻止了多核併發,而asyncio從定義上就是單線程的,不受GIL影響,可是也不能從多核CPU中受益;
3. 「Asyncio避免了全部的競態條件」,錯誤,競態條件的可能性存在於任何併發編程中,無論是線程仍是基於事件的編程。Asyncio能夠消除常見的競態條件(如線程間共享內存訪問),但並無消除其它類型的競態條件(如分佈式微服務體系結構中共享資源的進程間競爭),與多線程相比優點在於由於await關鍵字的存在,更容易推斷如何訪問共享資源;
4. 「Asyncio使併發編程更容易」,錯誤,處理併發老是複雜的,asyncio只是使得避免某些噁心的bug容易一點。編程
即便有Asyncio,仍然有不少複雜問題沒有解決。你的程序如何支持健康檢查?如何在大量的C/S鏈接時,僅須要不多的數據庫socket來維持?程序如何安全關閉?如何處理硬盤訪問和日誌記錄?安全
Asyncio給你解決這些複雜問題提供了一種單線程的解決方法,可能會使編程容易一點。多線程