2015-06-11 29 views
3

我有很多這意味着並行執行的線程,因爲線程往往意味着做:dPython的線程Intefere如果執行的太快

除非我慢下來,他們往往木偶一個,另一個,寫給彼此的空間。因此,當我打印一份聲明時,我發現在某些線索中看起來似乎是「回聲」(不是編碼術語,而是文字回聲)。

當我真的放慢速度時,不會發生木偶戲。

這裏是我所得到的,當這些虛擬帳戶運行在終端上的例子:

Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, nine 
Robinia6424: day_2, Wed Jun 10 03:32:53 2015, four 
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, fifteen 
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, thirteen 
Mekushishifu643: day_7, Wed Jun 10 03:32:53 2015, two 
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, eleven 
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, six 
Mekushishifu643: day_2, Wed Jun 10 03:32:53 2015, three 
**Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, ten 
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten 
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten 
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten** 
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, fourteen 
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, sixteen 
DaDaFurstig6304: day_7, Wed Jun 10 03:32:53 2015, five 
DoraDiggle5529: day_7, Wed Jun 10 03:32:53 2015, one 
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, seven 

注意出現的標有「十」的那些迴音。

我真的希望我不必發佈我的代碼,因爲大多數python程序員可能會認識到我不是在這個線程問題,沒有我的300行類被張貼在這裏。

這些類是相當大的,所以我不會在這裏打擾他們。我懷疑這是一個常見的問題,我只是不認識,如處理器問題?

這是什麼原因造成的?怎樣才能避免使用時間延遲?

+0

您沒有正確同步對某些共享資源的訪問。例如,標準輸出流是共享資源;如果你需要一些'print'或一系列'print's不被其他線程的'print'中斷,你需要使用一個鎖或其他同步機制來確保。 – user2357112

+0

謝謝。現在我知道問題和方向了,我可以修復它。非常感激。 – 1Up

回答

3

這些線程是否訪問共享數據 - 即相同的變量或變量?如果是這樣,並且如果數據不受鎖定/同步保護,則易受線程race conditions的影響。在任何併發編程環境中都是如此,而不僅僅是Python。 Check out this nice summary of Python synchronization

+2

你以秒爲單位打敗我......用一種說明概念的方式 – paisanco

+1

加一個爲你的併發笑話 - 我把它放在你的Java'volatile'回答:-) –

+1

非常感謝。我正在使用鎖定功能,但是您的回答使我探索了放置鎖的位置。它似乎(雖然我不能確定,除非我測試更多),我可能已經解決了這個問題。 – 1Up

1

這是標準的線程行爲。不要使用具有共享輸出的線程。 Python的線程是原子的:這意味着如果你給他們一個孤立的環境,他們不會給你問題。如果你讓他們訪問共享數據被動態修改,或寫入共享對象或緩衝區,那麼你會得到這樣的問題。

問題是你不正確地使用線程。寫入每個線程內的單獨緩衝區,當線程完成時,然後合併結果。

+0

我覺得這對大多數python程序員來說已經完成了。謝謝你不低調。所以「打印」和「記錄」算作共享輸出? – 1Up

+1

檢查sparc的答案。他總結得比我想象的要好。 –