如何在导入的模块中使用multiprocessing.Pool?
问题内容:
我无法在这里实现建议:将两个函数同时应用于两个列表。
我猜是因为该模块是由另一个模块导入的,因此我的Windows生成了多个python进程?
我的问题是:如何在没有if的情况下使用以下代码 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_males
和process_females
是fuctions。 args_m, args_f
是迭代器
另外,我不需要返回任何东西。代理是需要更新的类实例。
问题答案:
的想法if __name__ == '__main__':
是避免产生无限的进程。
腌制主脚本中定义的函数时,python必须弄清楚主脚本的哪一部分是函数代码。基本上,它将重新运行您的脚本。如果创建的代码Pool
在同一脚本中,并且不受“
if main”的保护,那么通过尝试导入该函数,您将尝试启动另一个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()