2011-01-22 63 views
4

的 多線程應用程序的主要挑戰是 共享數據 或其他資源協調線程。爲此, 線程模塊提供了多個同步基元,包括鎖,事件,條件變量, 和信號量的 。Queue.Queue VS信號量,鎖等在多線程Python代碼

雖然這些工具功能強大,但較小的 設計錯誤可能會導致難以重現的問題 。所以, 任務 協調的首選方法是集中所有 訪問線程中的資源,然後使用隊列模塊 向其他線程請求來自 的請求。使用 的應用程序Queue.Queue對象用於線程間 的通信和協調是 更容易設計,更具可讀性和更可靠。

它,基本上,各國利用Queue.Queue用於線程間的溝通和協調,而不是功能強大的工具,如信號量,鎖等

我的問題是,什麼是的缺點建議的方法?什麼時候應該使用更「強大的工具」,爲什麼?

編輯

要清楚,我知道信號燈是什麼。我只是想知道爲什麼Python文檔建議使用Queue.Queue方法而不是「強大的工具」 - 我只是簡單地使用文檔自己的措辭,而不是自己動手。

+0

只是一個快速澄清問題,你知道什麼信號量? – aqua 2011-01-22 02:39:20

+0

我不確定這是一個澄清問題,但是,是的,我知道它們是什麼。 – Sev 2011-01-22 02:48:32

回答

6

我不確定我會考慮信號量並鎖定「更強大的方法」,正如你所建議的那樣。

隊列通常是一個高階抽象。換句話說,你可以使用信號量和鎖來構建線程安全的隊列。

您將使用哪個取決於您的應用程序。隊列對於在線程和進程之間傳遞「工作」是很好的,信號量/鎖定對保護關鍵部分或共享資源非常有用,因此一次只能有一個線程訪問。

1

Take a look at the source code for Python's thread-safe queue。隊列類從3個條件和一個鎖構建一個有用的抽象,正確

我不會說協調是最難的問題。在共享狀態多線程中,最難的是阻止線程「共享」。由於線程意外地共享和跺跺彼此的數據,您總是必須注意非確定性行爲。

所以,我建議你不要使用線程。如果你覺得你沒有足夠的時間來追蹤heisenbugs,你應該使用低級工具,但是如果有任何方法可以用一個簡單的隊列逃脫,那就去做吧。