python ThreadPool不工作(顺序执行而不是并行执行)

时间:2017-07-09 15:14:33

标签: python-2.7 threadpool python-multiprocessing

我正在使用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

1 个答案:

答案 0 :(得分:0)

您似乎想要使用std::vector<int> vec = ...; std::cout << range(vec); 而不是mapapply_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即可使用它。