并发编程 学习目标: 见35复习一、操做系统 什么是操做系统 操做系统的两大做用: 批处理操做系统: 操做系统发展史: 多道技术***** 产生背景: 两大核心点: 应用软件的优化的核心:*****二、进程 一、进程理论(*****) 一、进程与程序区别 二、并发,并行,串行是什么 三、不一样操做系统开启子进程的区别 四、一个进程的三种运行状态 二、开启进程的两种方式(*****) 3.多进程的执行顺序 ****** 四、进程对象的经常使用属性 5 僵尸进程和孤儿进程(了解)** 六、守护进程(**) 见36复习 七、互斥锁与信号量(**) 是什么 为何使用 互斥锁与join的区别: 如何使用 注意强调点 Semaphore信号量(了解) 八、IPC机制:队列,管道(*) 三种方式 九、进程queue=管道+锁 (***) 十、生产者消费者模型(*****) 见37复习 一、什么是生产者消费者模型? 二、什么用生产者消费者模型? 三、为何要用生产者消费者模型?好处? 四、如何实现? 总结点三、线程 一、线程理论(*****)见37复习 一、是什么 二、线程vs进程 二、开启线程的两种方式(*****) 三、守护线程(**) 四、互斥锁与信号量(**)见38复习 五、GIL vs 互斥锁(*****) 一、什么是GIL 二、GIL的影响 三、GIL的优缺点: 四、GIL vs 互斥锁 6 Cpython的解释器下***** 七、死锁现象与递归锁(**) 八、线程queue(***) 九、Event事件(**)四、池(*****)见38复习 是什么 为什么要用池: 何时用池: 如何用池? 总结点五、单线程下实现并发(***) 见39复习 1 同步调用 异步调用+回调机制 提交任务的两种方式: 什么是同步异步 任务执行的三种状态: 同步调用vs阻塞,两种不一样的'等'的效果 异步回调 ****** 什么是异步回调? 为何须要回调?(好比 烧水壶,水烧开后 水壶会发出响声) 注意点: 回调函数何时被执行? 谁在执行回调函数? 线程的异步回调 2.线程队列 ** 队列 堆栈 优先级队列 三、单线程下实现并发(***) 什么是协程 并发 并发实现的本质=切换+保存状态(两类切换) 高性能分析: 为何须要协程 如何实现协程(三种) 协程的应用场景: 总结点:六、网络IO模型(主要掌握理论***) 见40复习 网络传输中的两个阶段 1.阻塞IO 2.非阻塞IO 3.多路复用 4.异步IOsockserver---------------------------------------------------并发编程 学习目标:让服务器可以支持高并发+高性能一、什么是操做系统 操做系统是位于计算机硬件与应用软件之间 用于协调、控制、管理计算机硬件与软件的资源的一种控制程序 操做系统的两大做用: 一、把复杂丑陋的硬件操做都封装成美丽的接口,提供给应用程序使用 二、把进程对硬件的竞争变的有序 操做系统发展史: 第一代计算机 程序是固定 没法修改 某种计算机只能干某种活 第二代计算机 批处理系统 须要人工参与 将程序攒成一批 统一执行 串行执行 提升计算机的利用率 可是调试麻烦 批处理操做系统:(串行) 把程序员的程序攒成一堆 而后批处理系统读一道程序到内存而后执行 执行完毕后输出,而后才能读入下一道程序。。。 第三代计算机 为了更好利用计算机资源 ,产生了多道技术 多道技术***** 产生背景:在单核背景下实现多个进程并发执行的效果 两大核心点: 一、空间上的复用 (多道程序复用内存的空间) 内存分割为多个区域 每一个区域存储不一样的应用程序 内存中同时读入多道程序,多道程序的内存空间是物理隔离的 二、时间上的复用 (多道程序复用CPU时间) 切换+保存状态 1 正在执行的进程遇到IO操做时 会切换到其它程序 能够提升效率 2 运行时间过长 或者有一个优先级更高的进程抢走了CPU 反而会下降效率 (固然由于cpu速度贼快 用户感受不到)!!!!!应用软件的优化:最核心的优化就是减小IO操做,减小对硬盘的读写操做二、进程 一、进程理论(*****) 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有不少任务要作:python备课的任务,写书的任务,交女友的任务,王者荣耀上分的任务, 但egon同一时刻只能作一个任务(cpu同一时间只能干一个活),如何才能玩出多个任务并发执行的效果? egon备一会课,再去跟李杰的女友聊聊天,再去打一会王者荣耀....这就保证了每一个任务都在进行中. 进程与程序区别 程序说白了就是一堆文件 进程就是一个正在执行的过程/程序 是一个资源单位 二、并发与并行 并发:看起来同时运行,实际上 不一样任务间来回切换 单核就能够实现并发,可是单核没法实现并行 并行:真正意义上的同时运行,一个cpu同一时刻只能作一件事 只有多核才能同时作多件事,即并行的效果 串行:按照固定的顺序一个个地执行(第一个任务没执行完 第二个只能等待) 三、不一样操做系统开启子进程的区别 windows-CreateProcess unix-fork 都会拷贝父进程的状态, 区别点是unix系统fork拷贝的子进程的初始状态和父进程如出一辙. 进程的终止 windows-ExitProcess unix-exit 四、一个进程的三种运行状态 运行态(正在执行)- 阻塞态(遇到IO)- 就绪态(运行时间过长/有优先级更高的抢走CPU) 只有运行态和就绪态能够来回切换 阻塞态切换到运行态时 须要通过就绪态 二、开启进程的两种方式(*****) 1.直接实例化Process这个类 参数target中传入任务函数 2.继承Process类 实现run函数 方式一: from multiprocessing import Process import os,time def task(name): print('%s is running' %os.getpad()) if __name__ == '__main__': obj=Process(taget=task,args=('egon',)) obj.start() # 发送信号给操做系统 print('主') 方式二: from multiprocessing import Process import os,time class Work(Process): def run(self): print('%s is ruuning' %self.pid) time.sleep(3) if __name__ == '__main__': obj=Work() obj.start() # 发送信号给操做系统 print('主') (启动进程的方式 1.系统初始化 会产生一个根进程 2.用户的交互请求 鼠标双击某个程序 3.在一个进程中 发起了系统调用启动了另外一个进程 ****** 4.批处理做业开始 某些专用计算机可能还在使用) 3.多进程的执行顺序 ****** 主进程必然先执行 子进程应该在主进程执行后执行 一旦子进程启动了 后续的顺序就没法控制了 四、进程对象的经常使用属性 obj.start() 开启进程 obj.join(1) 父进程等待子进程 obj.terminate() 终止进程 obj.is_alive() 是否存活 obj.pid 获取进程id obj.name 进程名称 "我是主程序个人pid:%s 个人父进程是:%s" % (os.getpid(),os.getppid()) "我有一个儿子是 %s" % obj.pid 5 僵尸进程和孤儿进程(了解)** 僵尸进程:有害 一个子进程任务执行完就死亡了 可是操做系统不会当即将其清理 为的是 开启这个子进程的父进程能够访问到这个子进程的信息(如PID) 这样已完成任务的 可是没有被操做系统清理的进程称为僵尸进程 直到父进程结束后发起调用回收子进程(减小PID占用),僵尸进程越少越好 孤儿进程:无害! 没有爹的称为孤儿 一个父进程已经死亡 然而他的子孙进程还在执行着 这时候操做系统会接管这些孤儿进程