Параллель python - joblib: повторное использование рабочих с оператором "with"

Я использую модуль Multiprocessing в JobLib. Я кодирую итеративный алгоритм, где мне нужно вызывать 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__

В другом сообщении о стеке потока ( Python Multiprocessing Lib Error (AttributeError: __exit__)) был ответ, в котором упоминалось, что для оператора with в Python 2.7 требуется менеджер контекста. Они предложили определить менеджер контекста, который оборачивается вокруг параллельного вызова. Я попробовал следующее:

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'

Кто-нибудь знает, как я могу правильно построить менеджер контекста для Parallel в Python 2.7?

1 ответ

Я считаю, что вы видите эту ошибку, потому что вы используете версию JobLib, которая не поддерживает этот синтаксис. Он был представлен в joblib 0.9, выпуск 14 октября 2015 года.

Другие вопросы по тегам