ThreadPoolExecutor有效,但ProcessPoolExecutor无效

时间:2018-10-29 15:41:09

标签: python parallel-processing future

使用Python 3.7.1,此功能就可以

with concurrent.futures.ThreadPoolExecutor(max_workers = 2) as executor:
    print("Exec")
    result = executor.map(lambda a: kernel(**a), params)

也可以工作

for p in params:
    kernel(**p)

kernel返回一个dict并执行一些计算量大的工作。它不使用全局变量。 params包含用户定义的类,但是pickle.dumps(params)不返回错误和字节字符串。

文件本身是可导入的,即在文件的底部有if __name__ == "__main__": main()

但是,如果我使用ProcessPoolExecutor,执行将停止。 Exec已打印,仅此而已。 CPU负载处于空闲状态。

我希望使用Process模型来绕过GIL。

谢谢!

1 个答案:

答案 0 :(得分:2)

回答我自己的问题,一个较旧的Python版本给了我一个提示:

Traceback (most recent call last):
  File "/usr/lib/python3.5/multiprocessing/queues.py", line 241, in _feed
    obj = ForkingPickler.dumps(obj)
  File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps
    cls(buf, protocol).dump(obj)
AttributeError: Can't pickle local object 'main.<locals>.<lambda>'

因此,我从地图中取出了lambda表达式,现在它也可以与ProcessPoolExecutor一起使用。