使用Python多处理在子进程内创建子进程失败

Da *_*ang 9 python multiprocessing

尝试在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 Code Online (Sandbox Code Playgroud)

父程序在以下子程序child_process.py中调用"run"函数:

import multiprocessing

def run():
        pool = multiprocessing.Pool(processes=4)
        print 'TEST!'
        pool.close()
        pool.join()
Run Code Online (Sandbox Code Playgroud)

当我运行父程序时,没有打印出任何内容,程序很快退出.但是,如果print 'TEST!'在上面移动了一行(在创建嵌套子进程之前),'TEST!'则打印4次.

由于子进程中的错误不会打印到屏幕,这似乎表明当子进程创建自己的嵌套子进程时程序崩溃.

谁能解释一下场景背后会发生什么?谢谢!

Da *_*ang 6

正如 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()
Run Code Online (Sandbox Code Playgroud)

子程序(名称为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()
Run Code Online (Sandbox Code Playgroud)

输出为 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
Run Code Online (Sandbox Code Playgroud)


nox*_*fox 5

根据多处理文档,守护进程不能生成子进程.

multiprocessing.Pool 使用守护进程来确保在程序退出时它们不会泄漏.