У меня есть приложение, которое запускает подпроцессы (в настоящее время 64) и выполняет некоторую работу. Каждый процесс заканчивается примерно через 45 минут, но каким-то образом родительский процесс, кажется, зависает, потому что родительский процесс не выходит и не зависает в цикле соединения.Подпроцессы завершены, но родительский процесс зависает
я начинаю proccesses так:
def worker(out_q):
# do something that takes a lot of time
print('done working')
sys.exit(0)
def main():
procs = []
out_q = Queue()
for i in range(opt.num_threads):
sys.stdout.write("\r\tStarting Worker Process: %d" %(i+1))
sys.stdout.flush()
p = multiprocessing.Process(target=worker, args=(out_q,))
procs.append(p)
p.start()
#then i wait for all processes to finish:
try:
for i, p in enumerate(procs):
print("waiting for process %d" %i)
p.join()
print("process %d joined" %i)
except KeyboardInterrupt as e:
sys.exit(0)
if __name__ == "__main__":
main()
единственный выход я вижу waiting for process 0
и после того, как сделаны все процессы (я вижу все процессы говорят done working
, есть еще все 64 процессов в списке процессов и родительский процесс не завершается. Кажется, что родительский процесс повесил трубку, потому что он не может быть убит диспетчером задач.
Как я могу отлаживать это или мне нужно убить процесс? удаляться из списка процессов после вызова sys.exit (0) ins образ ребенка?
Рабочие ставят что-то в 'out_q'? Вы потребляете очередь? –
да, они делают. я видел это здесь http://bugs.python.org/issue8237 Теперь я проверяю, как полно очередь очереди, и попытайтесь реализовать очередную промывку ... – reox