Каков наилучший способ запуска нескольких подпроцессов через fork ()?

Сценарий python должен порождать несколько подпроцессов через fork (). Все эти дочерние процессы должны выполняться одновременно, и родительский процесс должен ждать завершения всех этих процессов. Было бы неплохо иметь возможность установить некоторый тайм-аут на «медленном» ребенке. Родительский процесс обрабатывает остальную часть скрипта после того, как все дети будут собраны.

Каков наилучший способ его решения? Благодарю.

4 Solutions collect form web for “Каков наилучший способ запуска нескольких подпроцессов через fork ()?”

Простой пример:

import os chidren = [] for job in jobs: child = os.fork() if child: children.append(child) else: pass # really should exec the job for child in children: os.waitpid(child, 0) 

Сроки медленного ребенка – это немного больше работы; вы можете использовать wait вместо waitpid и отбирать возвращаемые значения из списка дочерних элементов, а не ждать по очереди (как здесь). Если вы настроили alarm с помощью обработчика SIGALRM , вы можете прекратить ожидание после указанной задержки. Это все стандартные файлы UNIX, а не Python-specific …

Эфемент : каждый ребенок в вашем коде останется в цикле for после окончания его работы. Он будет вилка снова и снова. Более того, дети, которые начинают, когда дети [] не пусты, будут пытаться дождаться некоторых своих братьев в конце цикла. В конце концов кто-то рухнет. Это обходное решение:

 import os, time def doTheJob(job): for i in xrange(10): print job, i time.sleep(0.01*ord(os.urandom(1))) # random.random() would be the same for each process jobs = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] imTheFather = True children = [] for job in jobs: child = os.fork() if child: children.append(child) else: imTheFather = False doTheJob(job) break # in the meanwhile # ps aux|grep python|grep -v grep|wc -l == 11 == 10 children + the father if imTheFather: for child in children: os.waitpid(child, 0) 

Вы посмотрели на модуль обработки pyprocessing ?

Традиционный способ UNIX-y для связи с подпроцессами заключается в том, чтобы открыть каналы на их стандартный ввод / вывод и использовать системный вызов select() для мультиплексирования сообщений в родительском процессе (доступно в Python через … select модуль).

Если вам нужно убить медленный дочерний процесс, вы можете просто сохранить его идентификатор процесса (возвращается os.fork() ), а затем использовать os.kill() чтобы убить его, когда он больше не нужен. Разумеется, было бы, наверное, более чисто, чтобы я мог напрямую общаться с дочерним процессом и сказать, чтобы он закрылся.

  • open () в Python не создает файл, если он не существует
  • Python: почему распечатываемые заявления и вывод subprocess.call () не синхронизированы?
  • Кросс-платформенное пространство, оставшееся на томе с использованием python
  • обнаруживать новые или измененные файлы с помощью python
  • как убить процессы зомби, созданные модулем многопроцессорности?
  • Ошибка: команда 'gcc' не удалась с статусом выхода 1 на CentOS
  • Имитировать прерывание клавиатуры Ctrl-C в Python во время работы в Linux
  • Замена fcntl в Windows
  • Python - лучший язык программирования в мире.