一 : 概述
进程由三部分组成 : 代码段,数据段,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()语句之前.