衆所周知,我們需要在使用if __name__ == '__main__'
的Python中運行代碼multiprocessing
時保護main()
。在Python多重處理中使用__name __ =='__ main__'的解決方法
我明白,這是在某些情況下,必要時給予進入主定義的函數,但我不明白這是爲什麼在這種情況下,有必要:
import numpy as np
from multiprocessing import Pool
class Something(object):
def get_image(self):
return np.random.rand(64,64)
def mp(self):
image = self.get_image()
p = Pool(2)
res1 = p.apply_async(np.sum, (image,))
res2 = p.apply_async(np.mean, (image,))
print(res1.get())
print(res2.get())
p.close()
p.join()
main.py
from file2 import Something
s = Something()
s.mp()
Something
工作所需的所有功能或進口是58的一部分。爲什麼子過程需要重新運行main.py
?
我認爲__name__
解決方案不是很好,因爲這阻止了我分發的代碼,因爲我無法確定它們是保護它們的主體。 對於Windows沒有解決方法嗎? 是如何解決的軟件包 -
編輯(因爲我從來沒有遇到過不保護我的主要有任何包中的任何問題,他們只是沒有使用多?): 我知道,這是因爲沒有實現fork()
的視窗。我只是問,如果有一個黑客讓翻譯在開始,而不是main.py
,我可以肯定的是是自給自足
'if __name__ =='__main __''hack只在Windows上需要,因爲該平臺沒有'fork()'。如果您選擇_any_其他操作系統,則不需要它。 –
OP,只是爲了確認,你在windows上是否正確? –
如果我正確理解你,你正在編寫'file2.py'作爲一個庫,並且你想要支持像'main.py'這樣的用戶代碼(將來可能會被其他人編寫)。不幸的是,我不認爲有什麼辦法可以保護你的用戶免受'multiprocessing'的需求。您可能只需要記錄您的模塊需要將腳本代碼放在'if __name__ ==「__main __」'塊中,以便在模塊導入時不會運行任何內容。 – Blckknght