9月28日学习内容整理:多进程,并发,子进程的创建(multiprocessing模块)
一、多进程
重要重要重要:::进程永远是操作系统创建的,跟程序没有任何关系
1、进程的三种状态:运行,阻塞,就绪
运行到阻塞:通常是遇到输入输出操作时切换
运行到就绪:通常是程序运行时间过长,操作系统控制cpu暂时停止运行,变为就绪态
注意一点:操作系统将进程暂时停止运行时会保留当前运行状态以供后续从断点继续运行
2、并发,并行
(1)并发是针对单核的概念,是伪并行,实际上是操作系统在很短很短的时间内对进程的来回切换,看起来是同时在运行
(2)并行是多核的概念,多个cpu同时处理程序
3、创建进程:
(1)系统初始化(我们不涉及)
(2)一个进程里创建一个子进程(这是我们要做的)
(3)用户交互(也不涉及)
(4)批处理(也不涉及)
二、创建子进程(multiprocessing模块)Process是一个类
1、创建子进程的方式:
Windows系统必须加 if _ _name_ _=='_ _main_ _' ,在main中执行
(1)方式一:实例化对象时,穿参数args 必须是元组形式,kwargs必须是字典形式
举例:
from multiprocessing import Process import time def work(name): print('%s is piaoing' %name) time.sleep(300) print('%s piao end' %name) if __name__ == '__main__': Process(target=work,kwargs={'name':'alex'}) #target是函数名 p=Process(target=work,args=('alex',)) p.start() #向操作系统发送创建进程的请求 print('主')
(2)方式二:必须写run函数
举例:
from multiprocessing import Process import time class Work(Process): #定义类,继承Process def __init__(self,name): super().__init__() #重用父类的方法 self.name=name def run(self): print('%s is piaoing' %self.name) time.sleep(2) print('%s piao end' %self.name) if __name__ == '__main__': p=Work('wupeiqi') p.start() #向操作系统发送创建进程的请求 print('主')
2、僵尸进程的概念:指子进程还未结束父进程就被结束,这些子进程没人回收会一直存在内存中,就被称为僵尸进程
注意:
1、主进程要等子进程结束后才会结束,因为主进程要等待子进程结束后回收子进程的数据(就是收尸)
2、start()只是向操作系统发出创建子进程的请求,并不是直接就开始运行子进程,记住进程永远是操作系统控制,控制进程的创建和执行,至于什么时候创建和执行不是我们能知道的,也不需要我们关心,我们只需要操作系统完成功能就可以了
3、脑子里一定要有并发的概念,尤其当有多个子进程的时候
4、子进程开启时会把父进程的初始数据全部拷贝一份
补充:os.getpid 子进程号 os.getppid 父进程号
三、multiprocessing模块的其它方法
1、上面说过的start()
2、Process类对象名.join 主进程等待子进程结束后再执行后面的代码,意思就是遇到join主程序就不继续执行了,等当前子程序执行完才继续执行
3、terminate() 干掉进程(一般别用)
4、is_alive()进程是否还在
5、name 进程名字
6、pid 进程号