并发编程
阅读目录
理论知识
必备的理论基础:
一.什么是操作系统:
管理且优化使用计算机硬件是一件非常繁琐的事情,程序员是无法把所有的硬件操作细节都了解到的,于是计算机安装了一层软件(系统软件),成为操作系统,用来管理计算机硬件,这样,程序员只需要考虑应用软件的编写,应用软件直接使用操作系统提供的功能间接使用硬件就可以了. 所以,简单来说,操作系统就是一个协调,管理,控制计算机硬件资源和软件资源的控制程序.操作系统所处的位置如图:
二.操作系统的作用:
1.隐藏了丑陋复杂的硬件接口,提供了良好的抽象接口; 例如,操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件,我们就无序考虑对磁盘的读写控制. 2.将应用程序对硬件资源的竞争请求变得有序化 例如,很多应用程序其实是共享一套计算机硬件.假如现在有三个应用程序都申请了打印机打印.那么a程序竞争到了资源就打印,b程序竞争到了就打印b的...,这就导致了无序.打印机可能一会儿打印一段a的内容,一会儿再打印c的内容.操作系统的一个功能就是让这种无序变得有序.
三.多道技术:
背景: 针对单核,实现并发
现在的主机一般是多核,那么每个核都会利用多道技术.比如,有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个cpu的任意一个.
空间上的复用: 如内存中同时有多道程序;
时间上的复用: 复用一个cpu的时间片.
强调: 遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,以便下次切换回来时,能基于上次切走的位置继续.
进程
什么是进程
顾名思义,进程就是正在进行的程序.
详细来说:
第一,进程是一个实体.每一个进程都有自己的内存空间.
第二,进程是一个"执行中的程序".
进程的调度
进程的调度算法:
1.先来先服务算法
2.短作业优先算法
3.时间片轮转法
4.多级反馈队列
进程的并行与并发
并发: 并发是指资源有限的情况下,两个进程交替使用资源.
并行:并行是指两个进程同时进行.例如多个cpu执行多个任务.
区别:
并行是从微观上来说的,也就是说同一时刻,有不同的程序在执行,这就需要有多个处理器.
并发是从宏观上来说的,同一时间段上有不同任务在执行,同一时刻只有一个任务.
同步异步阻塞非阻塞
程序的三状态: 就绪,执行,阻塞
同步: 一个任务的执行依赖另一个任务的完成.
异步: 一个任务的执行不依赖另一个任务的完成.
阻塞: 当进程不满足程序运行的条件时,进程就会进入等待状态,知道满足条件为止,这就是阻塞.
非阻塞: 除了阻塞,都是非阻塞.
设置非阻塞: sk.setblocking(False)
在python程序中的进程操作
multiprocessing模块
process模块
p.start() : 启动进程,并调用该子进程中的p.run()
p.run() : 进程启动时运行的方法,正是它去调用target指定的函数,我们自定义中的类一定要实现该方法.
p.terminate() : 强制终止进程.
p.is_alive() : 判断进程是否还活着.如果p仍运行,返回True
p.join(timeout) : 主进程等待p终止,才会继续执行
进程之间数据隔离
from multiprocessing import Process def work(): global n n=0 print('子进程内: ',n) if __name__ == '__main__': n = 100 p=Process(target=work) p.start() print('主进程内: ',n) 进程之间的数据隔离问题
守护进程
守护进程只守护主进程,会随着主进程代码的结束而结束.
锁Lock,信号量Semaphore,事件Event
锁--multiprocessing.Lock
当多个进程使用同一份数据资源时,会引发数据安全问题,使用Lock,就将进程变成串行,保证了数据安全.
信号量-- multiprocessing.Semaphore
信号量就是: 锁+计数器
互斥锁同时只允许一个进程更改数据,而信号量是同时允许一定数量的进程更改数据.
事件-- multiprocessing.Event
event有一个默认的标识,默认为"False". set: 将False设置为True. clear: 将True设置False. is_set: 判断是否为True. wait: 标识为False,进入阻塞;标识为True,开始执行.
进程间通信
IPC (Inter-Process-Communication)
实现IPC的方法:
队列Queue :管道+锁
管道Pipe :
进程池
定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务.池中进程的数量是固定的.
回调函数
什么是回调函数?
进程池中任何一个任务结束,就告知主进程,主进程再调用一个函数来处理该结果.
线程