2015-08-26 69 views
0

我發現,當導入模塊並同時使用多處理時,奇怪的事情開始發生。舉個例子:多處理中的全局狀態

# ------------------------- 
# main.py 
# ------------------------- 
import multiprocessing 
import foo 

def bar(a): 
    foo.test() 

if __name__ == "__main__": 
    pool = multiprocessing.Pool(5) 
    pool.map(bar, [1] * 15) 

# ---------------------------- 
# foo.py 
# ---------------------------- 
import api # Note the indirect import. 

def test(): 
    print(api.a) 

# ---------------------------- 
# api.py 
# ---------------------------- 
print("Imported") 
a = 5 

對於我這個例子中,輸出是這樣的:

Imported 
Imported 
5 
5 
5 
5 
5 
5 
5 
5 
5 
5 
5 
Imported 
5 
5 
5 
5 

注意,模塊api正在導入(即執行)多次。我怎麼能避免這種情況?我想在模塊api中運行一次(如C中的靜態初始化),並且我想從其他進程訪問結果狀態(在這種情況下爲api.a) - 但只能初始化一次。

在實際使用情況下,我從api模塊中的用戶獲取敏感輸入,並且我想要將該用戶輸入恰好一次。目前,用戶必須輸入他的數據一次,每個進程執行的進程 - 每次模塊進口。

+0

請說明代碼的哪些部分在哪個模塊中。我假設上面的代碼不在同一個文件中。 – Pynchia

+0

@Pynchia我添加到哪個文件開始 – WorldSEnder

+0

OK謝謝(順便說一句,評論開始#)更大的意見。然後解釋你打算做什麼。你得到的行爲正是你應該從給定場景期望的。問題是你想要達到什麼目的/爲什麼你需要這樣做? – Pynchia

回答

0

每個進程都有它自己的解釋器實例,這就是爲什麼你的模塊導入了多次。 (每次打印新的進程開始Imported)。

關於此問題的更多信息official documentatioin

+1

這是對問題的解釋,但並不真正解決它。 – WorldSEnder

+0

在主進程中詢問用戶輸入,然後將數據提供給您的池。 – trollknurr