我正在使用ThreadPool
中的multiprocessing.pool
,但它似乎无效(即它是按顺序执行而不是并行执行:res1
需要14秒,{{1}需要11s,使用res2
需要27s而不是14s。
我认为问题出在ThreadPool
,因为它使用(共享)another_method
。
我已尝试在read_only_resource
中使用time.sleep(val)
而不是调用另一种方法(按预期工作 - 只需要通过的最大值),我也是试图传递another_method
的深层副本(这不起作用,需要27秒)。
我已经没有什么可以尝试做到这一点:
read_only_resource
答案 0 :(得分:0)
您似乎想要使用std::vector<int> vec = ...;
std::cout << range(vec);
而不是map
。 apply_async
函数不能并行化多个函数调用。相反,它是异步调用函数的单个实例。由于您调用它两次并按顺序获得结果,因此您将获得序列化性能。
调用apply_async
将并行运行函数的多个实例。它需要将输入打包成单个对象,例如一个元组,因为它只允许将一个参数传递给您的函数。然后,所有打包输入都可以放在列表或其他可迭代中,并提供给map
,例如:
map
此外,您可以使用work_args =[(some_text, read_only_resource), (other_text, read_only_resource), ... ]
results = pool.map(method, work_args)
之类的内容来创建itertools.izip()
,例如:
work_args
请注意,由于您使用的是work_args = itertools.izip([some_text, other_text, ...], read_only_resource)
,因此您可能无法获得更多性能提升,具体取决于所完成的工作。许多地方已经讨论过这个主题,但由于Global Interpreter Lock,Python可能无法像你期望的那样与线程并行化。 See here获得了一个很好的总结。简而言之,如果您的功能是进行I / O操作,ThreadPool
可以提供帮助。
但是,如果使用ThreadPool
,则会同时执行多个进程。只需将multiprocessing.Pool
替换为ThreadPool
即可使用它。