2010-09-15 145 views
4

我有一個Python/wxPython程序,其中GUI是主線程,我使用另一個線程從文件加載數據。有時這些文件很大並且加載速度很慢,所以我使用wxPulse對話框來指示進度。Python:安全地讀取線程中的對象的值?

當我加載文件時,我計算了已經在計數線程中讀取的行數,並在主線程的wxPulse對話框中顯示此計數。我通過讀取加載線程正在寫入的相同變量來獲取主線程中的計數。

這是「線程安全」嗎?這可能會導致問題嗎?我已經做了一段時間,迄今爲止一直很好。

PS。我知道我可以使用隊列來傳遞計數,但我很懶,不想如果我不需要。

+0

使用[queue](http://docs.python.org/library/queue.html),它們非常容易使用。 – Seth 2010-09-15 04:19:29

+0

@Seth:我已經使用隊列處理其他事情,並且認同他們很容易處理。看起來我並不需要一個隊列來處理這種特殊情況,因此最好不要將代碼與不需要的功能混淆起來。 – 2010-09-15 19:56:19

+0

大家好:感謝各位的好評。太糟糕了,我只能挑一個。 – 2010-09-15 19:56:48

回答

5

一般只要...

  • 你只能有一個線程寫入它,並...
  • 這不是重要的是,計數準確與顯示值同步保持..

這很好。

1

這很好,因爲您只有一個寫入程序線程。只讀操作始終是線程安全的。當您閱讀多個相關值並期望它們之間存在某種形式的一致性時,會出現這種情況。由於寫入可能隨時發生,多個值的讀取可能不一致,甚至可能根本沒有任何明智的程序狀態。在這種情況下,使用鎖來使多個讀取看起來像是任何寫入獨佔的單個原子操作。

0

只是因爲它不是特別重要纔是安全的。奇怪的事情,如價值不更新時,應該無關緊要。當你假裝讀取和寫入的單個int是「原子」時會發生什麼,這很難得到明確的答案,因爲它取決於確切的體系結構和一堆其他的東西。但它不會做任何比有時給錯號碼更糟糕的事情,所以請繼續......或者使用一個隊列。 :)

1

這是相當安全的。

當計數從n增加到n + 1時,創建「n + 1對象」,然後將計數從引用「n對象」切換到新的「n + 1對象」。

沒有舞臺count是指比「N對象」或「N + 1個對象」

2

在普通的Python以外的東西,這將是安全的,因爲變量的所有訪問被GIL保護(全局解釋器鎖定),這意味着對一個變量的所有訪問都被同步,因此一次只能有一個線程執行此操作。唯一的問題是@Eloff指出,如果您需要讀取多個值並且需要它們保持一致 - 在這種情況下,您需要設計一些訪問權限控制。