使用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。
谢谢!
答案 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一起使用。