簡體   English   中英

Python 中的線程(和異步任務)如何調度?

[英]How are threads (and asyncio tasks) scheduled in Python?

我試圖了解 Python 中的並發性,並且對如何安排線程以及如何安排任務(在 asyncio 庫中)運行/等待感到困惑。

假設一個線程試圖獲取一個鎖並被阻塞。 Python 解釋器是否立即將該線程放入“阻塞”隊列? 這個被阻塞的線程如何放回正在運行的 state 中? 是否涉及忙等待?

當異步庫中的任務(相當於線程)被異步互斥鎖阻塞時,這有什么不同?

如果上述兩種情況都沒有涉及到忙等待,那么 asyncio 的優勢是什么?

假設一個線程試圖獲取一個鎖並被阻塞。 Python 解釋器是否立即將該線程放入“阻塞”隊列?

Python 創建真正的操作系統線程,因此解釋器不需要進行排隊或調度。

一個可能的例外是解釋器使用全局鎖來序列化 Python 代碼的執行和對 Python 對象的訪問。 這個鎖不僅在獲取線程鎖之前被釋放,而且在任何(可能的)阻塞操作之前被釋放,例如從 IO 句柄讀取或休眠。

如果上述兩種情況都沒有涉及到忙等待,那么 asyncio 的優勢是什么?

優點是 asyncio 不需要為它並行執行的每個協程創建一個新的 OS 線程。 操作系統線程很昂貴,而異步任務非常輕量級。 此外, asyncio 使潛在的切換點可見( await關鍵字),因此競爭條件的可能性較小。

您可以將 asyncio 視為Twisted的繼承者,但使用現代 API 並使用可掛起的協程而不是顯式的回調鏈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM