如何在导入的模块中使用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_malesprocess_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()