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



python linux установка (3)

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

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

https://src-bin.com


Answer #1

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


Answer #2

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

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 ...


Answer #3

Эфемент : каждый ребенок в вашем коде останется в цикле 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)




linux