1并发编程就是让你的程序可以同时处理多个任务
2.并发编程的基石是 多道技术
空间复用:同一个时间 内存存储了多个程序
时间复用:当一个程序遇到了io操作,或者长时间占用cpu后切换到其他程序上,来提高cpu利用率
多道技术的缺点:当应用程序都是计算任务时候切换反而会降低效率(但是必须切换才能保证多任务并发)
3 并发 与 并行
并发 多个事件同时发生,也称为伪并行
并行多个事件同时进行
阻塞和非阻塞 指的是程序的状态:
1.就绪 2.运行 3.阻塞
4两种使用进程的方式
1.直接创建Process对象 指定target参数
from multiprocessing import Process import os # def task(name): print(name) print("self",os.getpid()) print("parent", os.getppid()) print("task run") # windows创建子进程时 子进程会将父进程的代码加载一遍 导致重复创建子进程 # 所以一定要将 创建子进程的代码放到main的下面 if __name__ == '__main__': print("self", os.getpid()) print("parent", os.getppid()) p = Process(target=task, name="这是子进程!",kwargs={"name":"bgon"}) # 创建一个表示进程的对象 但并不是真正的创建进程 p.start() # 给操作系统发送通知 要求操作系统开启进程
2继承Process 覆盖run 方法
创建进程的第二种方式 继承Process 覆盖run方法 # 在子进程启动以后会自动执行run方法 # 其优势是 可以自定义 进程的属性和行为 来完成一些额外任务 例如下载 # class MyProcess(Process): # # def __init__(self,url): # self.url = url # super().__init__() # # # 子类中的方法 只有run会被自动执行 # def run(self): # print("下载文件...." , self.url) # print(" run run run!") # # def task(self): # pass # # def task(): # print(123) # if __name__ == '__main__': # p = MyProcess("www.baidu.com/xx.mp4") # p.start()
5 每个进程之间的数据都是独立的.子进程再被创建的时候会拷贝一份父进程的数据, 而子进程中的数据修改,不影响父进程
6 p.join() 用来使子进程对象再被cpu调用时提高优先级 优先调用执行完子进程后 再去执行 父进程中的接下去的代码程序
import time from multiprocessing import Process def task(): print("上传文件....") time.sleep(3) print("上传结束...") # [进程1,进程2,进程3] if __name__ == '__main__': p = Process(target=task) p.start() p.join() # 本质上 是提高了子进程优先级 当CPU在切换时 会优先切子进程 print("上传文件成功!") def task(num): print("我是%s号 进程" % num) time.sleep(2) print("=========") if __name__ == '__main__': start_time = time.time() ps = [] for i in range(3): p = Process(target=task,args=(i,)) p.start() ps.append(p) for p in ps: p.join() print(time.time()-start_time) print("over")
7.process 的常用属性:
p.is_alive() # 布尔值 判断进行是否是存活运行的
p.terminate() 终止这个进程
p.daemon 守护进程
8 孤儿进程和僵尸进程
孤儿进程 指的是 父进程已经被终止了 但自己还在运行 是无害的 后续由操作系统接手进行回收
僵尸进程 是指子进程执行完成所有任务后 已经终止了但是残留了一些信息 (进程id名字 等资源) 但是父进程没有去处理这些残留 ,僵尸进程是有害的,当出现大量的僵尸进程时 会占用系统资源 可以把它父进程杀掉 僵尸就成了孤儿 操作系统会负责回收数据
import time
from multiprocessing import Process
def task1():
print("子进程 run")
if __name__ == '__main__':
for i in range(10):
p = Process(target=task1)
p.start()
time.sleep(100000) 父进程睡眠产生僵尸进程