了解并行,并发,同步,异步,阻塞,非阻塞 , 并在代码中体现
理论知识:
进程间通信 简称: IPC
名词释义
并发 : 就是同时做多件事
并行 : 在同意时刻,处理多个任务,必须多核才能并行
同步 : 多任务,多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,存在的多条运行主线
异步 : 多任务,多个任务执行的时候要求有先后顺序,必须一个先执行完成后,另一个才能继续执行,只有一个主线
阻塞 : 从调用者的角度出发,如果在调用的时候,被卡住,不能在继续向下运行,需要等待,就说是阻塞
非阻塞 : 从调用者的角度出发,如果在调用的时候,没有被卡住,能够继续向下继续执行,无需等待,就说是非阻塞
开启多进程及多进程相关常用方法
#并发:
早起单核CPU的时候,没有并行的概念,只有并发(微观上串行,宏观上并行)
进程的两种开启方法
1, p=Process(target=None(函数名),args(参数,))
2, 自定义类,继承Process父类
进程常用方法
1, start() 开启一个子进程
2, join() 异步变同步(就是让父进程停留在join这句话,等待子进程执行结束后再执行父进程)
3, terminate() 杀死进程
4, is_alive() 判断进程是否活着
进程的常用属性
1, p.name = 给p进程一个名字
2, p.pid 返回p进程的pid
3, p.daemon = True 将p进程设置为守护进程 (True为守护进程,False为普通进程)
守护进程的两个特点:
守护进程会随着父进程的结束而结束
守护进程不能在创建子进程
代码示例:
用 p=Process(target=None(函数名),args(参数,)) 这种方式开启进程,这个代码里面包含用join阻塞
from multiprocessing import Process import time import os def func(i): time.sleep(2) print('这里是儿子%s进程,儿子自己的pid是%s,儿子的父进程pid是:%s'%('i',os.getpid(),os.getppid())) if __name__=='__main__': p=Process(target=func,args=(1,)) #开启进程(子进程) p.start() #执行子进程(相当于p.func()) p.join() #阻塞进程,等待子进程执行完后再执行主进程 print('父进程自己的pid是:%s,父亲的父亲的pid是:%s'%(os.getpid(),os.getppid()))
以继承类的方式开启子进程
from multiprocessing import Process import time class Myprocess(Process): #继承Process这个类 def __init__(self,name): super(Myprocess,self,).__init__() #执行父类的__init__方法 self.name = name def run(self): #子进程里的函数方法 time.sleep(3) #等待三秒 print('继承类的方式开启子进程,名字是%s'% self.name) if __name__=='__main__': #创建子进程的固定用法 p1=Myprocess('哈哈') #给self.name 传进参数 p1.start() #告诉操作系统,马上执行这个子进程(跟p1.run() 执行的结果是一样的)
开启多个子进程
from multiprocessing import Process import time import os def func(i): time.sleep(2) #让下面的print 等待两秒 print('子进程的名字是%s子进程的pid是%s,父进程的pid是%s'% (i,os.getpid(),os.getppid())) if __name__=='__main__': #创建子进程固定用法 for i in range(3): p=Process(target=func,args=(i,)) #实例化一个进程的对象 p.start() #执行子进程 print('父进程的pid是%s'% os.getppid())
杀死进程并判断是否杀死(p.terminate()杀死进程 , p.is_alive() 判断)
from multiprocessing import Process import time def func(i): print('哈哈哈') if __name__=='__main__': p=Process(target=func,args=(1,)) p.start() p.terminate() #杀死p进程,让解释器告诉操作系统,请杀掉p进程 print('呵呵',p.is_alive()) time.sleep(1) #这里需要让下一次程序执行等一会儿,不然看不到是否杀死了p进程,因为CPU运行速度太快 print('呵呵',p.is_alive()) ##返回一个bool值,如果返回True,代表进程还活着,如果返回False,代表子进程已经死了 ##p.is_alive() 判断p进程是否还活着 ##p.terminate() 杀死p进程