[英]Post-processing results after multi-processing in Python
因此,我有一個簡單的MP代碼,它的工作原理很吸引人。 但是,當我對通過MP生成的數據進行非常簡單的后處理時,該代碼將不再起作用。 它永遠不會停止並且永遠運行! 這是代碼(再次完美地工作):
import numpy as np
from multiprocessing import Pool
n = 4
nMCS = 10**5
def my_function(j):
result = []
for j in range(nMCS // n):
a = np.random.rand(10,2)
result.append(a)
return result
if __name__ == '__main__':
__spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)" # this is because I am using Spyder!
pool = Pool(processes = n)
data = pool.map(my_function, [i for i in range(n)])
pool.close()
pool.join()
#final_result = np.concatenate(data) ### this is what ruins my code! ###
同時,如果我在最后添加final_result = np.concatenate(data)
,它將永遠無法工作! 我正在使用Spyder ,如果我在MP完成后在控制台中簡單地輸入final_result = np.concatenate(data)
,它會給我我想要的東西,即串聯列表。 但是,如果我最后在主程序中放了那條簡單的線,那就行不通了。 誰能告訴我該如何解決?
PS:這是我生成的一個非常簡單的示例,因此您可以了解發生了什么。 我真正的問題是方法更加復雜,用MP完成后我無法進行后期處理。
您的問題是,當您運行np.concatenate
,它沒有在main函數中完成。 我懷疑您遇到的問題是Spyder特有的,但是更新縮進應該可以解決它。
正如已經暗示了@Ares一樣,您可以通過將if __name__ == "__main__"
-statement南部的所有if __name__ == "__main__"
縮進if __name__ == "__main__"
解決此問題。
僅供參考,這發生在Windows上,它不提供啟動Unix-y系統等新進程的功能,而是使用“ spawn”作為默認(唯一)啟動方法。 Spawn意味着,操作系統必須為每個工作進程從頭開始使用解釋器啟動新進程。
您的工作進程將需要導入目標函數my_function
。 發生這種情況時, if __name__ == "__main__":
- if __name__ == "__main__":
不受保護的所有內容也將在導入時的每個子進程中運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.