多道技术
单核实现并发的效果
必备知识点
- 并发:看起来像同时运行的就可以称之为并发
- 并行:真正意义上的同时执行
ps: - 并行肯定算并发
- 单核计算机肯定不能实现并行,但是可以实现并发。
多道技术图解:
多道技术重点知识:
空间和时间上的服用
- 空间上的服用:共用一套计算机硬件
- 时间上的服用:例如洗衣服10min 做饭30min 烧水10min 单道需要50min 多道只需要任务时间最长的那一个。其中会设计切换,和保存状态。
切换:
- 当一个程序遇到IO操作时候,操作系统会剥夺该程序的CPU执行权限,作用:提高了CPU的利用率,并且也不影响程序的执行效率
- 当一个程序长时间占用CPU的时候,操作系统也会剥夺该程序的CPU执行权限。作用:降低了程序的执行效率(原本时间+切换时间)
进程理论
程序和进程的区别:
程序就是一堆躺在硬盘上的代码,是“死”的。
进程则表示程序正执行的过程,是“活”的。
进程调度
要想多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法。
- 先来先服务调度算法:先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。
- 短作业优先服务调用算法:短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。
- 时间片轮转+多级反馈队列:
进程的三状态
两对重要概念
同步与异步
描述的是任务的提交方式
同步:任务提交之后,原地等待任务的返回结果,等待的过程中不做任何事。
程序层面上表现出来的感觉就是卡住了
异步:任务提交之后,不原地等待任务的返回结果,直接去做其他事情。
那么返回结果怎么获取?任务的返回结果会有一个异步回调机制自动处理
阻塞与非阻塞
描述的是程序的运行状态
阻塞:阻塞态
非阻塞:就绪态,运行态
上述概念组合:最高效的一种组合就是异步非阻塞
创建进程的两种方式
开启进程与线程的方式是相似的。
windows操作系统下 创建进程一定要在main内创建
因为windows下创建进程类似于模块导入的方式
会从上往下执行代码
# 第一种
from multiprocessing import Process
import time
def task(name):
print('%s is running' % name)
# time.sleep(3)
print('%s is over' % name)
if __name__ == '__main__':
# 1 创建一个对象
p = Process(target=task, args=('jason',))
# 2 开启进程
p.start() # 告诉操作系统创建一个进程
print('异步')
'''
异步
jason is running
jason is over
'''
# 第二种
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print('running')
print('over')
if __name__ == '__main__':
p = MyProcess()
p.start()
print('主程序')
创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去,一个进程对应在内存中就是一块独立的内存空间,多个进程对应在内存中就是多块独立的内存空间。
进程与进程之间数据默认情况下是无法直接交互,如果想交互可以借助第三方工具、模块。
Join方法
join是让主进程等待子进程代码运行结束之后,再继续运行,不影响其他子进程的执行
from multiprocessing import Process
import time
def task(name):
print('%s is running' % name)
time.sleep(3)
print('%s is over' % name)
if __name__ == '__main__':
# 1 创建一个对象
p1 = Process(target=task, args=('jason',))
# 2 开启进程
p1.start() # 告诉操作系统创建一个进程
p1.join() # 主进程等待子进程运行结束之后再继续执行
print('异步')
'''
jason is running
jason is over
异步
'''