今日内容
一.操作系统的简单介绍
二,并发与并行
三.同步异步阻塞非阻塞
四.multiprocess模块
1. 操作系统的简单介绍
多道技术(重点)
空间复用:
时间复用:
进程之间是空间隔离的
分时系统
实时系统
通用操作系统
2.并发与并行
并发: 伪并行,看着像同时运行,其实是任务之间的来回切换(遇到阻塞现象io会提高代码的效率)
两个要记的现象:任务切换+保存状态(保存现场)
并行:真正的同时运行,应用的是多核技术(多个CPU)
进程的三状态: 就绪(等待操作系统调度去CPU里面执行) ,执行,阻塞三种状态之间切换
阻塞:
事件请求:input、sleep、文件输入输出、recv、accept等
事件发生:sleep、input等完成了
时间片到了之后有回到就绪状态,这三个状态不断的在转换。
3.同步异步阻塞非阻塞
提交任务的方式: 同步 异步 任务的执行状态: 阻塞 非阻塞
异步:任务的提交方式,多个任务提交出去,同时执行
同步阻塞: 程序一个一个往下进行,阻塞了也得等着(好比一群人在排队,每个人只能排队,而且不能做别的事情)
异步阻塞: 异步操作是可以被阻塞的,只不过他不是在处理消息的时候阻塞,而是在等待消息通知时被阻塞.(好比一群人不用排队,但是领了号在那里坐着,只能坐着,不能做别的事情)
同步非阻塞: 实际上是效率低下的。想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
异步非阻塞: 效率更高. 比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉点餐员说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式.
4.multiprocess模块
格式
from Muletprocessing import Process 进程创建的两种方式: 1). Process(target=f1,args=(n,))# 这里的args接收的是元祖类型 #kwargs={key:值} 或者kwargs接收到的是字典 2).class Myprocess(process): def __init__(self,n): #相当于执行process中的__init__() super().__init__() self.n=n def run(self): pass if __name__='__main__': #创建对象 M=Myprocess(参数) #相当于M执行run M.start()
join方法 :
主进程等待子进程执行结束后再继续执行
import time from multiprocessing import Process def f1(): time.sleep(2) print('xxxx') def f2(): time.sleep(2) print('ssss') if __name__ == '__main__': p1 = Process(target=f1,) p2 = Process(target=f2,) p1.start() p2.start() # 主进程等待子进程运行完才继续执行 # p1=Process(target=f1,) # p1.start() # p1.join() # print('开始p2啦') # p2 = Process(target=f2,) # p2.start() # p2.join() # print('我要等了...等我的子进程...') # time.sleep(2) # print('我是主进程!!!')
for 循环:
import time import multiprocessing import Process def func(i): time.sleep(3) print(i) if __name__='__main__': for i in range(20): p1=process(target=func,args=(i,)) p1.start() # 此时代码执行的for循环是创建了20个数字,执行了func函数