2

我在 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 正确构建上下文管理器吗?

4

1 回答 1

4

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

于 2015-10-24T15:04:47.797 回答