我在尝试在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次。
由于子进程中的错误不会打印到屏幕,这似乎表明当子进程创建自己的嵌套子进程时程序崩溃。
有人能解释一下场景背后会发生什么吗?谢谢!
答案 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()