Python 如何确保子进程不会在父进程终止时终止?

Python 如何确保子进程不会在父进程终止时终止?,python,ubuntu,parent-child,python-multiprocessing,child-process,Python,Ubuntu,Parent Child,Python Multiprocessing,Child Process,我有一个在类中运行子进程的父进程。子进程需要更长的时间才能完成。我想确保当父进程终止时,子进程不会终止。我该怎么做 下面是我的代码的一个非常简化的版本: # myClass.py from multiprocess import Process class myClass(self): def __init__(self): print ('setup the object') def parentProcess(self, idx) p = Pr

我有一个在类中运行子进程的父进程。子进程需要更长的时间才能完成。我想确保当父进程终止时,子进程不会终止。我该怎么做

下面是我的代码的一个非常简化的版本:

# myClass.py
from multiprocess import Process
class myClass(self):
    def __init__(self):
        print ('setup the object')
    def parentProcess(self, idx)
        p = Process(target=childFunc)
        p.start()
        time.sleep(3)
        print ('parent is done with ' + str(idx))
    def childProcess(self):
        print ('do some childish stuff')
        time.sleep(8)
这就是我运行父进程的方式

# main.py
from multiprocessing import Process
myClass import myClass
myC = myClass()
for i in range(10):
    p = Process(target=myC.parentProcess, args=i)
    p.start()
    p.join()

在所有进程完成之前,您的程序不会终止。试试这个:

from multiprocessing import Process

import time


def foo():
    time.sleep(2)
    print("Now I am done")


if __name__ == "__main__":
    p = Process(target=foo)
    p.start()
    print("I am done.")
但是,要控制流程的执行,请执行以下操作:

  • 使用
    child.join()
    等待子进程结束

  • 您应该使用两个循环,一个用于启动流程,另一个用于连接流程

试试这个:

from multiprocessing import Process

import time


def foo():
    time.sleep(2)
    print("Now I am done")


if __name__ == "__main__":
    p = Process(target=foo)
    p.start()
    print("I am done.")
from multiprocessing import Process

import time


class MyClass():
    def __init__(self, idx):
        self.idx = idx

    def start_parent(self):
        p = Process(target=self.child_func)
        p.start()
        time.sleep(1)
        print('parent is done, waiting for child', self.idx)
        p.join()
        print('parent exiting', self.idx)

    def child_func(self):
        print('child start', self.idx)
        time.sleep(2)
        print('child end', self.idx)

if __name__ == "__main__":
    parents = []
    for i in range(10):
        o = MyClass(i)
        p = Process(target=o.start_parent)
        parents.append(p)
        p.start()

    for p in parents:
        p.join()

    print("all done")
或者更好的方法是,将
过程
子类化并实现
run()


你用的是哪种操作系统?@tdelaney ubuntuf从我的头顶上:叉两次,换一个pgroup,从终端分离,读史蒂文斯的APUE@wildplasser对不起,我对多重处理有点陌生,不理解您所说的任何内容。你能说得更清楚一点吗?一般来说,父进程应该管理它的子进程,或者子进程应该能够完全独立于父进程处理自己(这是@wildplasser的建议)。double fork将子对象从控制台会话中取出,并归
init
所有,后者将处理其僵化状态。