傳遞給threading.Thread.__init__()
的數據的語義是什麼?他們是否被複制並使其成爲本地線程?或者,他們是否繼續與創建線程共享?文檔說args是一個元組,所以我認爲它會被深度複製,但是想確認。傳遞給python線程的args的語義。線程__init__
基本上,我想定期將緩衝區轉儲到磁盤,並且我計劃將此緩衝區作爲參數傳遞給保存線程的__init__
。我可以繼續修改調用線程中的緩衝區,而不用擔心它是否會在保存線程中受到影響?
傳遞給threading.Thread.__init__()
的數據的語義是什麼?他們是否被複制並使其成爲本地線程?或者,他們是否繼續與創建線程共享?文檔說args是一個元組,所以我認爲它會被深度複製,但是想確認。傳遞給python線程的args的語義。線程__init__
基本上,我想定期將緩衝區轉儲到磁盤,並且我計劃將此緩衝區作爲參數傳遞給保存線程的__init__
。我可以繼續修改調用線程中的緩衝區,而不用擔心它是否會在保存線程中受到影響?
除非明確複製,否則數據通常在Python中共享。除非緩衝區本身具有線程安全設計,否則在一個線程中修改緩衝區並非安全操作。您需要以某種方式同步緩衝區的訪問權限。
我可以繼續在調用線程中修改緩衝區,而不用擔心它會在保存線程中受到影響嗎?
你可以,如果你使用multiprocessing.Process
代替threading.Thread
...過程中獲得的的Process.Start()調用的時間通過fork的數據 - 在一個過程中的數據無法修改另一個進程中的數據。儘管爲了執行IPC,您將需要使用Queue或Pipe或使用多處理模塊(Value,Array等)中的共享對象。
對於意味深度複製的元組沒有任何意義。 –
元組本身是不可變的,但這並不意味着它所持有的東西是。如果您傳遞一個列表,並且調用線程修改列表,則被調用線程將看到更改。 –
我的錯誤在說明我的意思。由於args是一個元組,它在'Thread .__ init__'中是不可變的。或者,也許我不明白爲什麼以下工作: >>> a,b,c = 1,2,3, >>> t =(a,b,c) >>> a = 4 >>> t (1,2,3)' –