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

时间:2015-09-21 06:48:18

标签: 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()

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

import multiprocessing

def run():
        pool = multiprocessing.Pool(processes=4)
        print 'TEST!'
        pool.close()
        pool.join()

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

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

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

3 个答案:

答案 0 :(得分:5)

根据multiprocessing文档,守护进程无法生成子进程。

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

答案 1 :(得分:1)

正如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

答案 2 :(得分:1)

我没有足够的声誉来发表评论,但是由于python版本确定了用于运行分层多处理的选项(例如a post from 2015),因此我想分享自己的经验。 Da Kuang的上述解决方案适用于通过Anaconda 3运行的python 3.7.1。

我对child_process.py进行了少量修改,使其运行了一段时间,因此我可以检查系统监视器以验证16个同时运行的进程是否在运行。

import multiprocessing

def test(info):
    print('TEST', info[0], info[1])
    aa=[1]*100000
    a=[1 for i in aa if all([ii<1 for ii in aa])]
    print('exiting')

def run(proc_id):
    pool = multiprocessing.Pool(processes=4)
    pool.map(test, [(proc_id, i) for i in range(4)])
    pool.close()
    pool.join()