Создание дочерних процессов внутри дочернего процесса с ошибкой многопроцессорной обработки 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