深入Asyncio(一)入门介绍
介紹
Asyncio試圖解決什么問題?
對于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給你解決這些復雜問題提供了一種單線程的解決方法,可能會使編程容易一點。
總結
以上是生活随笔為你收集整理的深入Asyncio(一)入门介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat集群--单tomcat多实例
- 下一篇: EZOJ #361地理