Вы можете использовать независимый процесс (multiprocessing.Process) и использовать две очереди для связи с ним (multiprocessing.Queue), одну для ввода и другую для вывода.
Пример запуска процесса:
import multiprocessing
def processWorker(input, result):
work = input.get()
## execute your command here
pipe = subprocess.Popen(command, stdout = subprocess.PIPE,
stderr = subprocess.PIPE, shell = True)
stdout, stderr = pipe.communicate()
result.put(pipe.returncode)
input = multiprocessing.Queue()
result = multiprocessing.Queue()
p = multiprocessing.Process(target = processWorker, args = (input, result))
p.start()
commandlist = ['ls -l /', 'ls -l /tmp/']
for command in commandlist:
input.put(command)
for i in xrange(len(commandlist)):
res = result.get(block = True)
if not res is 0:
print 'One command failed'
Затем вы можете отслеживать, какая команда выполняется каждым подпроцессом, просто сохраняя команду, связанную с рабочим идентификатором (рабочий идентификатор может быть счетчиком, увеличиваемым при заполнении очереди новой работой).
Использование многопроцессорной обработки. Queue является надежным, поскольку вам не нужно полагаться на разбор stdout / err, и вы также избегаете связанных ограничений.
Более того, вы можете легко управлять большим количеством подпроцессов.
Затем вы также можете установить тайм-аут на то, как долго вы хотите, чтобы вызов get ожидал на максимуме, например:
import Queue
try:
res = result.get(block = True, timeout = 10)
except Queue.Empty:
print error