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。
使用 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。