【问题标题】:passing arguments and manager.dict to pool in multiprocessing in python 2.7在 python 2.7 的多处理中将参数和 manager.dict 传递给池
【发布时间】:2015-03-09 13:24:24
【问题描述】:

我想并行化一个函数,该函数将使用 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 python-2.7 multiprocessing pool


    【解决方案1】:

    所以问题在于将许多参数传递给池。正如这里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 传递给函数)

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2018-01-14
      相关资源
      最近更新 更多