ThreadPoolExecutor 有效,但 ProcessPoolExecutor 无效

ThreadPoolExecutor works, but ProcessPoolExecutor not

使用 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 returns 一个 dict 并做一些计算密集型的事情。它不使用全局变量。 params 包含用户定义的 类,但 pickle.dumps(params) returns 没有错误和字节字符串。

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

但是,如果我使用 ProcessPoolExecutor,执行就会停止。 Exec 被打印出来,仅此而已。 CPU负载闲置。

我更喜欢 Process 模型来绕过 GIL。

谢谢!

回答我自己的问题时,旧的 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。