我正在Is there a simple process-based parallel map for python?使用Python 3.6.1
关注答案。我试图以与使用常规map
函数相同的方式使用它。为什么会这样?如何创建与map
一起使用的并行lambda
函数?
def map_parallel(func, iterable, n_jobs=-1):
if n_jobs == -1:
n_jobs = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=n_jobs)
return pool.map(func, iterable)
map_parallel(lambda x: x + 3, range(100))
PicklingError: Can't pickle <function <lambda> at 0x185284f28>: attribute lookup <lambda> on __main__ failed
答案 0 :(得分:0)
多处理pickle对象在进程之间传递。 lambda
不可序列化(请参阅What can be pickled and unpickled?);它不能在进程之间传递。
你需要定义一个函数,然后传递它。
def add3(n):
return n + 3
map_parallel(add3, range(100))
或者对于这种情况,您可以将functools.partial
与operator.add
:
import functools
import operator
map_parallel(functools.partial(operator.add, 3), range(100))