在 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 传递到函数中)
我想并行化一个函数,该函数将使用 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 传递到函数中)