python - joblib parallel:使用“with”语句重用worker

时间:2015-10-21 04:45:09

标签: python python-2.7 parallel-processing multiprocessing joblib

我在joblib中使用Multiprocessing模块。我正在编写迭代算法,我需要在每次迭代时调用Parallel。我怀疑我在这里遇到了很多开销,因为我每次打电话都会创造并摧毁一大堆工人。

joblib文档引用了这种情况。但是,该解决方案似乎不适用于Python 2.7:

with Parallel(n_jobs=2) as parallel:
  accumulator = 0.
  n_iter = 0
  while accumulator < 1000:
    results = parallel(delayed(sqrt)(accumulator + i ** 2) for i in range(5))
    accumulator += sum(results)  # synchronization barrier
    n_iter += 1

产生错误消息:

AttributeError: __exit__

另一个stackoverflow帖子(Python Multiprocessing Lib Error (AttributeError: __exit__))有一个响应,提到Python 2.7中的with语句需要一个上下文管理器。他们建议定义一个包围Parallel调用的上下文管理器。我尝试了以下方法:

from contextlib import contextmanager, closing

@contextmanager
def terminating(fn):
  try:
    yield fn
  finally:
    fn.terminate()

with terminating(Parallel(n_jobs=2)) as parallel:
  accumulator = 0.
  n_iter = 0
  while accumulator < 1000:
    results = parallel(delayed(sqrt)(accumulator + i ** 2) for i in range(5))
    accumulator += sum(results)  # synchronization barrier
    n_iter += 1

但是,我收到以下错误消息:

AttributeError: 'Parallel' object has no attribute 'terminate'

有谁知道如何在Python 2.7中为Parallel正确构建上下文管理器?

1 个答案:

答案 0 :(得分:3)

我相信您看到此错误,因为您使用的是不支持此语法的joblib版本。它是在2015年10月14日发布的joblib 0.9中引入的。