2013-07-06 70 views
0

我需要做到這一點,而打印到標準輸出:
何時加鎖以進行多線程和多處理?

`lock.acquire()` 
    #printing to standard output 
    lock.release() 

對於多線程和多進程。
此外,只需從全局文件或全局變量的值中讀取就可以完成這項工作嗎? PS:我在python 2.7中做多線程和多處理。

回答

1

可以簡化到

with lock: 
    print(something) 

但是,是的,你需要避免打印到由不同的線程混合。

使用只讀變量時,不需要鎖定。閱讀文件時(因爲你正在改變狀態),你確實需要。

+0

從全局文件或變量讀取什麼?我也做同樣的多處理? –

+0

@sashasami我補充說 – JBernardo

+0

改變狀態是什麼意思?如果differenet線程只是使用全局文件來運行os命令,例如:運行一個像python test.py _myoutput standard_output命令,這裏test.py只是比較兩個文件字符character.test.py和standard_output是全局文件? ?如果線程使用不同文件指針讀取文件? –

0

由於GIL,Python的打印是線程安全的,您不會因多線程打印而導致Python的內部狀態。

但是,如果要確保多個打印語句將其所有打印件按邏輯方式分組,則需要確保按正確順序打印的方法。您發現的一種方法是使用鎖定,另一種IMO更簡單的方法是構建一個包含需要一起打印的所有內容的字符串。

+1

多進程呢? –

+1

打印不完全是線程安全的(即使在CPython中也是如此)。如果您打印多個參數,它可能會交錯。 – JBernardo

+0

'Python'沒有GIL,只有cPython實現,所以第一行不適用於pypy,jython或ironpython ... – mata