我發現,當導入模塊並同時使用多處理時,奇怪的事情開始發生。舉個例子:多處理中的全局狀態
# -------------------------
# 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
模塊中的用戶獲取敏感輸入,並且我想要將該用戶輸入恰好一次。目前,用戶必須輸入他的數據一次,每個進程執行的進程 - 每次模塊進口。
請說明代碼的哪些部分在哪個模塊中。我假設上面的代碼不在同一個文件中。 – Pynchia
@Pynchia我添加到哪個文件開始 – WorldSEnder
OK謝謝(順便說一句,評論開始#)更大的意見。然後解釋你打算做什麼。你得到的行爲正是你應該從給定場景期望的。問題是你想要達到什麼目的/爲什麼你需要這樣做? – Pynchia