在 python 2.7 中将参数和 manager.dict 传递给多处理池

passing arguments and manager.dict to pool in multiprocessing in python 2.7

我想并行化一个函数,该函数将使用 Pool 而不是 Process 来更新共享字典,这样我就不会过度分配太多 cpu。

即我可以拿这个吗

def my_function(bar,results):
    results[bar] = bar*10

def paralell_XL():

    from multiprocessing import Pool, Manager, Process

    manager = Manager()
    results=manager.dict()

    jobs = []
    for bar in foo:
        p=Process(target=my_function, args=(bar, results))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()

并将 paralell_XL() 函数更改为类似这样的内容 ?

def paralell_XL():

    from multiprocessing import Pool, Manager, Process

    manager = Manager()
    results=manager.dict()

    p = Pool(processes=4)
    p.map(my_function,(foo,results))

尝试以上操作会出现以下错误

TypeError: unsupported operand type(s) for //: 'int' and 'DictProxy'

谢谢

所以问题在于将许多参数传递给池。如此处所示 Python multiprocessing pool.map for multiple arguments 您只需要将其变成一个元组并添加一个包装器。这也适用于将 manager.dict 作为参数传递。

def my_function(bar,results):
    results[bar] = bar*10

def func_star(a_b):
    """Convert `f([1,2])` to `f(1,2)` call."""
    return my_function(*a_b)

def paralell_XL():

    from multiprocessing import Pool, Manager, Process
    import itertools

    manager = Manager()
    results=manager.dict()

    pool = Pool(processes=4)    
    pool.map(func_star, itertools.izip(foo, itertools.repeat(results)))

(请注意,我认为这个问题 + 答案值得保留,因为我不完全清楚您是否可以通过这种方式将 manager.dict 传递到函数中)