簡體   English   中英

在Python中進行多處理后的后處理結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM