Соответствующая часть кода похожа на это:
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 является очень медленной, и эта ошибка редка, таким образом, я не смог надеть его там).
Рекомендуемый способ запуска подпроцесса - использовать модуль subprocess.
pipe = Popen(["program", "arg1", "arg2"])
pipe.wait()
Я бы рекомендовал вам установить 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()