使用多处理

时间:2017-05-04 01:47:47

标签: python function lambda parallel-processing pickle

我正在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

1 个答案:

答案 0 :(得分:0)

多处理pickle对象在进程之间传递。 lambda不可序列化(请参阅What can be pickled and unpickled?);它不能在进程之间传递。

你需要定义一个函数,然后传递它。

def add3(n):
    return n + 3

map_parallel(add3, range(100))

或者对于这种情况,您可以将functools.partialoperator.add

一起使用
import functools
import operator

map_parallel(functools.partial(operator.add, 3), range(100))