如何确保子进程不会在父进程终止时终止?
How to make sure the child process does not terminate when the parent does?
我有一个父进程,它 运行 是 class 中的一个子进程。子进程需要更长的时间才能完成。我想确保子进程不会在父进程终止时终止。我该怎么做?
这是我的代码的一个非常简化的版本:
# 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
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")
或者更好的是,继承 Process
并实现 run()
:
from multiprocessing import Process
import time
class ParentProcess(Process):
def __init__(self, idx, *args, **kwargs):
super().__init__(*args, **kwargs)
self.idx = idx
def run(self):
print('parent start', self.idx)
child = ChildProcess(self)
child.start()
time.sleep(1)
print('waiting for child', self.idx)
child.join()
print('parent end', self.idx)
class ChildProcess(Process):
def __init__(self, parent, *args, **kwargs):
super().__init__(*args, **kwargs)
self.parent = parent
def run(self):
print('child start', self.parent.idx)
time.sleep(5)
print('child end', self.parent.idx)
if __name__ == "__main__":
parents = [ParentProcess(i) for i in range(10)]
for p in parents:
p.start()
for p in parents:
p.join()
print("all done")
我有一个父进程,它 运行 是 class 中的一个子进程。子进程需要更长的时间才能完成。我想确保子进程不会在父进程终止时终止。我该怎么做?
这是我的代码的一个非常简化的版本:
# 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
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")
或者更好的是,继承 Process
并实现 run()
:
from multiprocessing import Process
import time
class ParentProcess(Process):
def __init__(self, idx, *args, **kwargs):
super().__init__(*args, **kwargs)
self.idx = idx
def run(self):
print('parent start', self.idx)
child = ChildProcess(self)
child.start()
time.sleep(1)
print('waiting for child', self.idx)
child.join()
print('parent end', self.idx)
class ChildProcess(Process):
def __init__(self, parent, *args, **kwargs):
super().__init__(*args, **kwargs)
self.parent = parent
def run(self):
print('child start', self.parent.idx)
time.sleep(5)
print('child end', self.parent.idx)
if __name__ == "__main__":
parents = [ParentProcess(i) for i in range(10)]
for p in parents:
p.start()
for p in parents:
p.join()
print("all done")