Мой вопрос, надеюсь, достаточно конкретный, чтобы не относиться ни к одному из других, которые я читал. Я хочу использовать подпроцесс и многопроцессорную обработку, чтобы периодически генерировать множество заданий и возвращать код возврата ко мне. Проблема в том, что я не хочу ждать(), поэтому я могу создавать задания сразу, но я хочу знать, когда она закончится, чтобы я мог получить код возврата. У меня есть эта странная проблема, где, если я опросу() процесса, она не будет работать. Он просто зависает в мониторе активности без запуска (я нахожусь на Mac). Я думал, что могу использовать поток наблюдателей, но я вишу на q_out.get(), что заставляет меня поверить, что, возможно, я заполняю буфер и тупик. Я не уверен, как обойти это. В основном это мой код. Если у кого-нибудь есть лучшие идеи о том, как это сделать, я был бы счастлив полностью изменить свой подход.Код возврата подпроцесса Python без ожидания
def watchJob(p1,out_q):
while p1.poll() == None:
pass
print "Job is done"
out_q.put(p1.returncode)
def runJob(out_q):
LOGFILE = open('job_to_run.log','w')
p1 = Popen(['../../bin/jobexe','job_to_run'], stdout = LOGFILE)
t = threading.Thread(target=watchJob, args=(p1,out_q))
t.start()
out_q= Queue()
outlst=[]
for i in range(len(nprocs)):
proc = Process(target=runJob, args=(out_q,))
proc.start()
outlst.append(out_q.get()) # This hangs indefinitely
proc.join()
Какая-либо конкретная причина иметь как многопоточность, так и многопроцессорность? – 2014-09-10 19:15:32
Почему вы трахаете задание «stdout», если у вас нет намерения читать содержимое? в зависимости от того, производят ли задания много вывода или нет, задания могут просто блокироваться при записи в стандартный вывод. – isedev
Я бы посмотрел на [Многопроцессорные пулы] (https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool). У них есть несколько способов запуска процессов синхронно или асинхронно, а получение кода возврата (либо путем ожидания, либо проверки позже) довольно гибко. Кроме того, есть несколько способов подключения обратных вызовов, которые выполняются, когда ваш подпроцесс завершается. – skrrgwasme