Создание дочерних процессов внутри дочернего процесса с ошибкой многопроцессорной обработки Python
Я наблюдал это поведение при попытке создать вложенные дочерние процессы в Python. Вот родительская программа parent_process.py
:
import multiprocessing
import child_process
pool = multiprocessing.Pool(processes=4)
for i in range(4):
pool.apply_async(child_process.run, ())
pool.close()
pool.join()
родительская программа вызывает функцию" run " в следующей дочерней программе child_process.py:
import multiprocessing
def run():
pool = multiprocessing.Pool(processes=4)
print 'TEST!'
pool.close()
pool.join()
когда я запускаю родительскую программу, ничего не было распечатано, и программа быстро вышла. Однако, если print 'TEST!'
перемещается на одну строку выше (до создания вложенных дочерних процессов), 'TEST!'
напечатаны для 4 раз.
поскольку ошибки в дочернем процессе не печатаются на экран, это, похоже, показывает, что программа аварийно завершает работу, когда дочерний процесс создает свои собственные вложенные дочерние процессы.
может ли кто-нибудь объяснить, что происходит за кулисами? Спасибо!
2 ответов
по данным многопроцессорность документация, демонические процессы не могут порождать дочерние процессы.
multiprocessing.Pool
использует демонические процессы, чтобы убедиться, что они не протекают, когда ваша программа extits.
как сказал noxdafox,multiprocessing.Pool
использует демонические процессы. Я нашел простой обходной путь, который использует multiprocess.Process
вместо:
Родительская программа:
import multiprocessing
import child_process
processes = [None] * 4
for i in range(4):
processes[i] = multiprocessing.Process(target=child_process.run, args=(i,))
processes[i].start()
for i in range(4):
processes[i].join()
дочерняя программа (с именем child_process.py
):
import multiprocessing
def test(info):
print 'TEST', info[0], info[1]
def run(proc_id):
pool = multiprocessing.Pool(processes=4)
pool.map(test, [(proc_id, i) for i in range(4)])
pool.close()
pool.join()
выход составляет 16 строк TEST
:
TEST 0 0
TEST 0 1
TEST 0 3
TEST 0 2
TEST 2 0
TEST 2 1
TEST 2 2
TEST 2 3
TEST 3 0
TEST 3 1
TEST 3 3
TEST 3 2
TEST 1 0
TEST 1 1
TEST 1 2
TEST 1 3