一 : 概述

  进程由三部分组成 : 代码段,数据段,PCB(进程控制块)

  Python中的进程编程依赖于multiprocessing这个包,其中Process类就是提供最基础的功能的类

二 : 使用Process类创建进程

  使用Process类可以创建新的进程,有两种使用方法:

    1.实例化Process类,参数如下:

      group参数未使用,值始终为None;

      target表示调用对象,即子进程要执行的任务,也就是方法名,不是字符串形式,也不带括号;

      args表示调用对象的位置参数元组,args=(1,2,'egon',);

      kwargs表示调用对象的字典,kwargs={'name':'egon','age':18};

      name为子进程的名称.

    这种方法需要先写好一个方法,作为参数传入Process实例化时候调用的__init__()方法

def func(i):
time.sleep(1)
print('这里是子进程')


if __name__ == '__main__':
p = Process(target=func, args=(1,)) # 实例化一个进程对象
p.start() # 开启一个子进程
print('这里是父进程')

# 结果:
# 这里是父进程
# 这里是子进程

    2.新写一个Process类的子类,初始化直接调用父类的初始化方法,自己实现一个名为run()的方法,这个方法提供的作用相当于方法1中提前写好的那个方法

class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()

    def run(self):
        print('这是以继承类的方式开启的子进程')


if __name__ == '__main__':
    p1 = MyProcess()
    p1.start()

# 结果:
# 这是以继承类的方式开启的子进程

三 : 进程对象的使用

  创建进程(进程类实例化)之后,需要调用start()方法启动它,我们知道,一个进程启动之后到销毁之前,有三种状态:就绪/阻塞/运行,调用该方法之后,进程就会进入就绪状态,等待操作系统给它分配时间片.

  其他方法介绍:

    run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法;

    terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁

    is_alive():如果p仍然运行,返回True

    join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

  run()和start()的纠葛:

    start()方法调用的就是run()方法,但是start()只是让进程处于就绪状态,run()则是让进程进入运行状态,大约相当于start()+join()的效果,所以run()之后也不会再调用join().

  常用属性:

    name : 给进程一个名字;

    pid : 进程的pid

    daemon : 默认为False,当为True时,该进程为守护进程

四 : 守护进程

  特点 : 1.守护进程随着父进程的结束而结束,普通子进程运行完父进程才会结束,即使父进程代码块已经运行完毕.

       2.守护进程不能再创建子进程.

  创建 : 将实例化出的进程对象的daemon属性设定为True即可,该语句需要在start()语句之前.