Порождение и ожидание дочерних процессов в Python - PullRequest
6 голосов
/ 08 июня 2010

Соответствующая часть кода выглядит следующим образом:

pids = [] 
for size in SIZES:
    pids.append(os.spawnv(os.P_NOWAIT, RESIZECMD, [RESIZECMD, lotsOfOptions]))

# Wait for all spawned imagemagick processes to finish
while pids:
    (pid, status) = os.waitpid(0, 0)
    if pid:
        pids.remove(pid)

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

Что-то не так с этим? Есть ли лучший способ сделать это?

Среда, в которой он должен работать, - это CentOS с Python 2.4, но я тестирую на Cygwin с Python 2.5, так что может случиться так, что он выйдет из строя на моей машине, но будет работать на Linux (машина с Linux очень медленно и эта ошибка встречается редко, поэтому я не смог ее устранить).

Ответы [ 2 ]

5 голосов
/ 08 июня 2010

Рекомендуемый способ запуска подпроцесса - использовать модуль подпроцесс .

pipe = Popen(["program", "arg1", "arg2"])
pipe.wait()
3 голосов
/ 08 июня 2010

Я бы порекомендовал вам установить python-subprocess32 - надежный бэкпорт версии стандартного библиотечного модуля subprocess для Python 3, подходящий для Python 2.4 до 2.7 и, безусловно, лучший способ запуска подпроцессы в Python 2. Затем в цикле вы выполните

pids.append(subprocess.Popen([RESIZECMD, lot, of, options])

и следующий цикл будет просто

for pid in pids:
    pid.wait()
...