来源:python中国网 时间:2019-06-06

  在面向对象中我们知道一个类通过继承父类可以拥有父类的属性和方法,既然Process类负责创建进程,那么我们自定义一个类继承Process类是不是也就具备创建进程的能力呢?必然如此!但是有些事项需要注意:

  1)Process类本身也有__init__方法,定义一个子类相当于重写了这个方法,

  2)重写__init__方法就会带来一个问题,我们可能不会完全初始化一个Process类,因为Process类的构造方法中可能会做一些初始化的操作。

  3)最好的方法就是将子类本身加上Process.__init__方法或者super().__init__(),完成这些初始化操作。

  通过继承的方式创建进程可以使得程序写起来更加灵活多变!可以练习2个小试牛刀:

# ‐*‐ coding: utf‐8 ‐*‐

from multiprocessing import Process
import time
import os


# 继承Process类
class ProcessSon(Process):

    def __init__(self,interval):
        Process.__init__(self)
        self.interval = interval

    # 重写了Process类的run()方法
    def run(self):
        print("子进程(%s) 开始执行,父进程为(%s)" % (os.getpid(),os.getppid()))
        t_start = time.time()
        print("子进程要休眠{}秒".format(self.interval))
        time.sleep(self.interval)
        t_stop = time.time()
        print("子进程(%s)结束,耗时%d秒" % (os.getpid(),t_stop-t_start))


if __name__=="__main__":

    print("当前程序进程(%s)" % os.getpid())
    p1 = ProcessSon(2)
    # 一个不包含target属性的Process类执行start()方法,就会运行这个类中的run()方法.
    p1.start()
    p1.join()
    print("主进程(%s)执行结束" % os.getpid())

D:installpython3python.exe D:/pyscript/test/test2.py
当前程序进程(7736)
子进程(9564) 开始执行,父进程为(7736)
子进程要休眠2秒
子进程(9564)结束,耗时2秒
主进程(7736)执行结束

Process finished with exit code 0
# ‐*‐ coding: utf‐8 ‐*‐

import multiprocessing
import os


class MyProcess(multiprocessing.Process):

    def __init__(self, num):
        self.num = num
        super().__init__()

    def run(self):
        for i in range(self.num):
            print("(%s)子进程(父进程:(%s)):%d" %
                (os.getpid(), os.getppid(), i))


if __name__ == '__main__':

    # 下面是主程序(也就是主进程)
    for i in range(5):
        print("(%s)主进程: %d" % (os.getpid(), i))
        if i == 2:
            # 创建并启动第一个进程
            mp1 = MyProcess(3)
            mp1.start()
            mp1.join()
            # 创建并启动第一个进程
            mp2 = MyProcess(3)
            mp2.start()
            mp2.join()
    print('(%s)主进程执行完成!' % (os.getpid()))

D:installpython3python.exe D:/pyscript/test/test2.py
(10564)主进程: 0
(10564)主进程: 1
(10564)主进程: 2
(9460)子进程(父进程:(10564)):0
(9460)子进程(父进程:(10564)):1
(9460)子进程(父进程:(10564)):2
(10900)子进程(父进程:(10564)):0
(10900)子进程(父进程:(10564)):1
(10900)子进程(父进程:(10564)):2
(10564)主进程: 3
(10564)主进程: 4
(10564)主进程执行完成!

Process finished with exit code 0