我最近注意到在 python 的不同包中有兩種不同的信號量實作,一種在threading包中,另一種在asyncio包中。我很好奇這兩種實作有什么區別?如果在異步函式中我嘗試使用threading包中的信號量,這會導致任何潛在問題嗎?
并通過查看python官方檔案,它寫道
asyncio primitives are not thread-safe, therefore they should not be used for OS thread synchronization (use threading for that)
但這句話是什么意思asyncio primitives are not thread-safe and should not be used for OS thread sync?
提前致謝
uj5u.com熱心網友回復:
信號量的整個目標是提供對某些東西的獨占訪問。任何時候只有一個“代碼”可以訪問自己的信號量。
我在前面的陳述句中所說的“代碼段”是什么意思取決于我使用的是多執行緒、多處理還是 asyncio。您保證獨占訪問的方式取決于我使用的內容。
Asyncio 是最受限制的一種多執行緒。一切都在單個 Python 執行緒中運行。Python 解釋器一次只執行一件事。每個“代碼段”都會運行,直到它自愿等待某事發生。然后允許運行另一個“代碼段”。最終,當它等待的事情發生時,原始代碼再次運行。
使用多執行緒時,多段代碼在 Python 解釋器中運行。任何時候都只有一段代碼運行,但它們并沒有禮貌地等待對方。Python根據需要從“代碼段”切換到“代碼段”。
通過多處理,多個 Python 可以同時運行。除了作業系統提供的代碼外,代碼段之間沒有共享。設定信號量通常需要作業系統的一些支持來創建所有執行緒/行程都可以訪問的共享變數。
所以。Asyncio 原語的設計使得它們都在一個單獨的 Python 行程中運行,并且行程相互協作。如果多段代碼試圖同時使用它,它們就不能作業。
我希望這有幫助。
uj5u.com熱心網友回復:
您無法選擇使用哪個佇列或哪個信號量。它們不兼容。
即使它們都提供并發性,asyncio多執行緒也是基于不同原理和 API、具有不同典型用例等的兩個完全不同的世界。
多執行緒程式的開發并不容易,Python 的一個稱為 GIL 的特性使它們沒有達到應有的效率。這使得 asyncio 成為首選,除非您被迫使用多執行緒。
話雖如此,這兩種方法都可以在一個程式中使用。
在多執行緒應用程式的執行緒之一中運行異步代碼是可能的,但并不常見。檔案中參考的通知提醒您,幾乎所有異步操作都必須在該執行緒中執行。只有少數專門的執行緒安全低級調度函式。
出于完整性考慮,asyncio庫可以利用執行緒池供其內部使用,因為所謂的阻塞操作不應由異步程式執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/335987.html
