Удаление демона из многопроцессорного процесса Python - PullRequest
0 голосов
/ 10 июня 2018

Используя python 3.6, у меня возникает такая проблема: (1) есть цикл joblib.Parallel над смущающе параллельными заданиями (2) сами задания являются довольно трудоемкими собственными объектами c ++, которые иногда сегментируются и код которых я не могу изменить.

Чтобы защититься от ошибок, я попытался обернуть сами задания в многопроцессорный процесс.К сожалению, сам Python выдает ошибку подтверждения с daemonic processes are not allowed to have children в этом решении.

Поэтому я взял опубликованное здесь решение и попытался унаследовать от Process: https://stackoverflow.com/a/8963618/614684

Это тоже не сработалои поэтому я нашел следующее решение, которое РАБОТАЕТ:

class NoDaemonProcess(multiprocessing.Process):
  def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
               *, daemon=None):
    super(NoDaemonProcess, self).__init__(group, target, name, args, kwargs, daemon=daemon)
    if 'daemon' in multiprocessing.process._current_process._config:
      del multiprocessing.process._current_process._config['daemon']
    self._config = multiprocessing.process._current_process._config.copy()
  # make 'daemon' attribute always return False                                                                                                                                              
  def _get_daemon(self):
    return False
  def _set_daemon(self, value):
    pass
  daemon = property(_get_daemon, _set_daemon)

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

Есть ли лучший способ сделать это?Буду признателен за любую помощь в создании этого более надежного и надежного.

1 Ответ

0 голосов
/ 10 июня 2018

Keep It Simple, Stupid:)

Ваше сообщение об ошибке: https://github.com/python/cpython/blob/master/Lib/multiprocessing/process.py#L110.

Вы можете использовать обычный subprocess как частьвашей рабочей нагрузки.Это не будет подчиняться какой-либо multiprocessing логике.Чтобы не создавать отдельную программу Python специально для этого, просто выполните

subprocess.Popen([sys.executable,__file__,"<arg>"])

и заставьте <arg> вызвать необходимую логику в блоке if __name__ == '__main__'.

Чтобы получить результат изподпроцесс, либо выведите его на стандартный вывод в любом машиночитаемом формате, либо используйте любой механизм IPC.

...