【问题标题】:Applying two functions to two lists simultaneously using Pool and multiprocessing使用池和多处理同时将两个函数应用于两个列表
【发布时间】:2025-12-25 06:15:05
【问题描述】:

我有一个(大)男性和女性特工名单。

我想对每个应用不同的功能。

在这种情况下如何使用 Pool?鉴于代理彼此独立。

一个例子是:

males = ['a', 'b', 'c']
females = ['d', 'e', 'f']
for m in males:
    func_m(m)
for f in females:
    func_f(f)

我是这样开始的:

from multiprocessing import Pool
p = Pool(processes=2)
p.map() # Here is the problem

我想要类似的东西:

p.ZIP(func_f for f in females, func_m for m in males) # pseudocode

【问题讨论】:

    标签: python multiprocessing python-multiprocessing


    【解决方案1】:

    这可以使用map_async 异步启动计算。这会启动所有需要的作业,然后您可以在结果中使用 get 方法将它们收集到一个列表中。

    from multiprocessing import Pool
    
    pool = Pool(4)
    res_male = pool.map_async(func_m, males)
    res_females = pool.map_async(fun_f, females)
    
    res = res_male.get()
    res.extend(res_females.get())
    

    您还可以查看更现代的concurrent.futures API,它对于此类计算更直观。

    【讨论】:

    • 谢谢@thomas-moreau。但是,如果我不需要返回任何东西怎么办?这个想法只是在每个代理中启动内部方法。
    • 嗯。我收到一个错误An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support()
    • 还有一件事。计算是导入和执行的模块的一部分。我需要 if name == "main": 吗?
    • 实际上,依次调用两个map_async会运行一个进程而不是另一个进程。我想知道是否可以同时生成两个函数和两个迭代器!
    • Pool 旨在按顺序运行作业列表。如果你想并行运行两个进程,你应该考虑使用 2 Process。另一种获得男性/女性交替的方法是使用apply_async 将工作按正确的顺序排列。你能解释一下你的限制吗?
    【解决方案2】:

    不是一个很好的答案,但首先想到的是:

    import itertools
    f = lambda t: func_m(t[0]) if t[1] else func_f(t[0])
    p.map(f, itertools.chain(((0,x) for x in females), ((1,x) for x in males)))
    

    【讨论】:

    • 谢谢。如果事实上我有多个参数要传递,我该如何实现它?
    • 我实现为f = lambda t: process_males(mortality_men, my_agents, graveyard, families, firms, year, agent=t[0]) if t[1] \ else process_females(mortality_women, fertility, year, families, my_agents, graveyard, firms, agent=t[0]) 但是,出现错误:_pickle.PicklingError: Can't pickle <function check_demographics.<locals>.<lambda> at 0x000000000AF9BF28>: attribute lookup <lambda> on demographics failed
    • 哦,对了,multiprocessing 不能接受 lambdas...*.com/questions/4827432/…