Подтвердить что ты не робот

Могут ли функции знать, если они уже многопроцессорны в Python (joblib)

У меня есть функция, которая использует многопроцессорность (в частности, joblib), чтобы ускорить медленную процедуру с использованием нескольких ядер. Он отлично работает; вопросов нет.

У меня есть набор тестов, в котором используется многопроцессорная обработка (в настоящее время только система multiprocessing.Pool(), но может изменить ее на joblib) для самостоятельного запуска каждой функции тестирования модуля. Он отлично работает; вопросов нет.

Проблема заключается в том, что теперь я интегрировал функцию многопроцессорности в набор тестов модулей, так что процесс пула запускает многопроцессорную функцию. Я хотел бы сделать так, чтобы внутренняя функция знала, что она уже многопроцессорна и не разворачивает больше своих вилок. В настоящее время внутренний процесс иногда зависает, но даже если этого не происходит, очевидно, что нет никакой выгоды для многопроцессорности в уже параллельной процедуре.

Я могу думать о нескольких способах (с файлами блокировки, настройке какой-то глобальной переменной и т.д.), чтобы определить состояние, в котором мы находимся, но мне интересно, есть ли какой-то стандартный способ понять это (либо в многопроцессорности PY или в joblib). Если он будет работать только в PY3, это будет хорошо, хотя, очевидно, лучше будут решения, которые также работают на 2,7 или ниже. Спасибо!

4b9b3361

Ответ 1

Ответ на конкретный вопрос: я не знаю о готовой утилите.

Минимальный (*) рефакторинг ядра должен был бы добавить именованный параметр для вашей функции, создающей в настоящее время дочерние процессы. Параметр по умолчанию будет вашим текущим поведением, а другое значение переключится на поведение, совместимое с тем, как вы выполняете тесты (**).

(*: могут быть другие, может быть, лучше, альтернативы дизайна для рассмотрения, но у нас недостаточно информации) (**: можно сказать, что введение условного поведения потребует также проверить это, и мы вернемся к квадрату...)

Ответ 2

Параллельный в joblib должен уметь сортировать эти вещи:
http://pydoc.net/Python/joblib/0.8.3-r1/joblib.parallel/

Две части из 0.8.3-r1:

# Set an environment variable to avoid infinite loops
os.environ[JOBLIB_SPAWNED_PROCESS] = '1'

Не знаю, почему они идут от переменной, относящейся к окружающей среде, к env. Сам.. Но как видите. Функция уже реализована в joblib.

# We can now allow subprocesses again
os.environ.pop('__JOBLIB_SPAWNED_PARALLEL__', 0)


Здесь вы можете выбрать другие версии, если это более важно:
http://pydoc.net/Python/joblib/0.8.3-r1/