【问题标题】:python ThreadPool not working (executed sequentially instead of in parallel)python ThreadPool 不工作(顺序执行而不是并行执行)
【发布时间】:2017-07-09 15:14:33
【问题描述】:

我正在使用来自multiprocessing.poolThreadPool,但它似乎不起作用(即它按顺序而不是并行执行:res1 需要 14 秒,res2 需要 11 秒,使用 ThreadPool 需要27 秒而不是 14 秒)。

我认为问题出在another_method,因为它使用(共享)read_only_resource

我尝试在 another_method 中使用 time.sleep(val) 而不是调用另一个方法(按预期工作 - 只要我通过的最大值就需要),我还尝试传递read_only_resource(这个不行,需要27s)。

我已经用完了所有东西来尝试完成这项工作:

def method(text_type, read_only_resource):
  value = some_processesing(text_type)
  return another_method(value, read_only_resource)


def main(): 
  same_read_only_resource = get_read_only_resource()
  pool = ThreadPool(processes=2)
  res1 = pool.apply_async(method, (some_text_type, same_read_only_resource))
  res2 = pool.apply_async(method, (other_text_type, same_read_only_resource))

  results1 = res1.get()
  results2 = res2.get()

【问题讨论】:

    标签: python-2.7 threadpool python-multiprocessing


    【解决方案1】:

    您似乎想使用map 而不是apply_asyncapply_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)
    

    请注意,由于您使用的是ThreadPool,因此您可能仍然不会获得太多的性能提升,具体取决于正在完成的工作。这个话题已经在很多地方讨论过,但是由于全局解释器锁,Python 可能不会像您期望的那样与 threads 并行化。 See here 进行了很好的总结。简而言之,如果您的函数要进行 I/O,ThreadPool 可以提供帮助。

    但是,如果您使用multiprocessing.Pool,您将同时执行多个进程。只需将ThreadPool 替换为Pool 即可使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-05
      • 2014-10-09
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2021-10-16
      相关资源
      最近更新 更多