Порождение и ожидание дочерних процессов в Python

Соответствующая часть кода похожа на это:

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 является очень медленной, и эта ошибка редка, таким образом, я не смог надеть его там).

7
задан Reinstate Monica 7 June 2010 в 21:59
поделиться

2 ответа

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

pipe = Popen(["program", "arg1", "arg2"])
pipe.wait()
5
ответ дан 7 December 2019 в 05:18
поделиться

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

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

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

for pid in pids:
    pid.wait()
3
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: