簡體   English   中英

如何在導入的模塊中使用 multiprocessing.Pool?

[英]How to use multiprocessing.Pool in an imported module?

我無法在這里實施建議: 同時將兩個函數應用於兩個列表

我想這是因為該模塊是由另一個模塊導入的,因此我的 Windows 產生了多個 python 進程?

我的問題是:如果沒有if __name__ == "__main__":

args_m = [(mortality_men, my_agents, graveyard, families, firms, year, agent) for agent in males]
args_f = [(mortality_women, fertility, year, families, my_agents, graveyard, firms, agent) for agent in females]

with mp.Pool(processes=(mp.cpu_count() - 1)) as p:
    p.map_async(process_males, args_m)
    p.map_async(process_females, args_f)

process_malesprocess_females都是函數。 args_m, args_f是迭代器

另外,我不需要返回任何東西。 代理是需要更新的 class 實例。

您需要在if __name__ == "__main__"保護多處理代碼的原因是,您不希望它在子進程中再次運行。 在Windows上可能會發生這種情況,在Windows上,解釋器需要重新加載其所有狀態,因為沒有fork系統調用會復制父進程的地址空間。 但是,由於您位於主腳本中,因此僅在應該在頂層運行代碼的地方使用它。 這不是保護代碼的唯一方法。

在您的特定情況下,我認為您應該將multiprocessing代碼放入函數中。 只要沒有其他東西在不應該調用該函數的情況下,它就不會在子進程中運行。 您的主模塊可以導入該模塊,然后調用該函數(可能在if __name__ == "__main__"塊中)。

應該是這樣的:

some_module.py:

def process_males(x):
    ...

def process_females(x):
    ...

args_m = [...] # these could be defined inside the function below if that makes more sense
args_f = [...]

def do_stuff():
    with mp.Pool(processes=(mp.cpu_count() - 1)) as p:
        p.map_async(process_males, args_m)
        p.map_async(process_females, args_f)

main.py:

import some_module

if __name__ == "__main__":
    some_module.do_stuff()

在您的真實代碼中,您可能想要傳遞一些參數或從do_stuff獲取返回值(與我在本示例中使用的通用名稱相比, do_stuff還應提供更具描述性的名稱)。

if __name__ == '__main__':的想法是為了避免產生無限的進程。

當腌制主腳本中定義的函數時,python必須弄清楚主腳本的哪一部分是函數代碼。 基本上,它將重新運行您的腳本。 如果創建Pool的代碼在同一腳本中,並且不受“ if main”的保護,那么通過嘗試導入該函數,您將嘗試啟動另一個Pool ,該Pool將嘗試啟動另一個Pool ...。

因此,您應該將函數定義與實際的主腳本分開:

from multiprocessing import Pool

# define test functions outside main
# so it can be imported withou launching
# new Pool
def test_func():
    pass

if __name__ == '__main__':
    with Pool(4) as p:
        r = p.apply_async(test_func)
        ... do stuff
        result = r.get()

還不能對這個問題發表評論,但我使用過的一個解決方法是在一個不同於進程產生位置的模塊中定義process_males等函數。 然后導入包含多處理生成的模塊。

我通過在主腳本的 "if __ name__ == "__ main__":" 中調用模塊的多處理 function 來解決它,因為涉及多處理的 function 是我模塊中的最后一步,如果適用,其他人可以嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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