对于一些简单的小任务,通常使用Process(target=test)。但是如果要处理复杂任务的进程,通常定义一个类,使其继承Process类,每次实例化这个类的时候,就等同于实例化一个进程对象。
使用Process子类创建2个子进程,分别输出父、子进程的PID,以及每个子进程的状态和运行时间,代码如下:
# -*-coding:utf-8 -*-
# 继承Process类
# print("------------继承Process类--------------")
class SubProcess(Process):
# 由于Process类本身也有__init__初始犯法,这个子类相当是重写了父类这个方法
def __init__(self, interval, name=""):
Process.__init__(self) # 调用父类初始化方法
self.interval = interval
if name:
self.name = name
# 重写了Process类的run()方法
def run(self):
print("子进程(%s) 开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
t_start = time.time()
time.sleep(self.interval)
t_stop = time.time()
print("子进程(%s)执行结束,耗时%0.2f秒" % (os.getpid(), t_stop - t_start))
if __name__ == "__main__":
print("---------父进程开始执行--------")
print("父进程PID:%s" % os.getpid())
p1 = SubProcess(interval=1, name='mrsoft')
p2 = SubProcess(interval=2)
# 对一个不帮韩target属性的Process类执行start方法,就会运行这个类中的run方法
# 故这里会执行p1.run()
p1.start()
p2.start()
# 输出p1和p2的进程的执行状态,如果真正进行,返回True
print("p1.is_alive=%s" % p1.is_alive())
print("p2.is_alive=%s" % p2.is_alive())
# 输出p1和p2进程的别名和PID
print("p1.name=%s" % p1.name)
print("p1.pid=%s" % p1.pid)
print("p2.name=%s" % p2.name)
print("p2.pid=%s" % p2.pid)
print("----------等待子进程----------")
p1.join()
p2.join()
print("-----------父进程结束----------")
上述代码中,定义了一个SubProcess类,继承了multiprocessing.Process类。SubProcess子类中定义了两个方法:init()初始方法和run()方法。在__init__()初始方法中,调用multiprocess.Process类的__init__()初始化方法,否则父类初始化方法会被覆盖,无法开启进程。此外,SubProcess子类中没有定义start()方法,但是在主进程中调用了start()方法,此时就会自动执行SubProcess中的run()方法