一、关于multiprocessing (关于进程的模块)模块Process方法
关于multiprocess包的介绍:
multiprocess该包中几乎包含了和进程有关的所有子模块。是python中一个操作、管理进程的包。 multi是取自multiple的多功能的意思,
由于提供的子模块非常多,为了方便记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享
process模块介绍: process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。 强调: 1. 需要使用关键字的方式来指定参数 2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍: targe:表示调用对象,即子进程要执行的任务 args:表示调用对象的位置参数元组,args=(1,"engo") kwargs:表示调用对象的字典,kwargs={"name":"egon",,"age":18}
方法介绍: p.start() 启动进程,并调用该子进程中的p.run() p.run() 进程启动时运行的方法,正是他去调用target指定的函数,我们自定义类的类中必须重新定义. p.join([timeout]) 主线程等待p终止(是主线程处于等的状态,而p是处于运行的状态),timeout是可选的超时时间.
p.name() #进程的名字
from multiprocessing import Process
import time def f1(): time.sleep(3) print("123") def f2(): time.sleep(3) print("撒拉嘿") #windows系统下,必须在代码中写main,否则会出现递归开启进程,报错(在系统创建一个子进程时,会import这个主进程的所有代码) if __name__ == '__main__': p1 = Process(target = f1,) #创建进程对象 p2 = Process(target = f2,) #创建进程对象
p1.start() #给操作系统发送创建进程信号,后续进程的执行则由操作系统来决定 p2.start()
Process方法传参的方式(常用):
from multiprocessing import Process def f1(n): print(n) if __name__ == '__main__': # p1 = Process(target=f1,args=('大力与奇迹',)) #创建进程对象,第一种传参方式 p1 = Process(target=f1,kwargs={'n':'大力'}) #字典key必须跟函数的形参名一致.创建进程对象,第二种传参方式 p1.start() #给操作系统发送了一个创建进程的信号,后续进程的创建都是操作系统的事儿了
Process方法传参的第二种方式,自己定义类时>>>:
class MyProcess(Process): def __init__(self,n):#自己定义的类,必须继承Process super().__init__() #必须执行父类的init self.n = n def run(self): #必须重新定义run方法 print('小黑and%s不可告人的事情'%self.n) if __name__ == '__main__': p1 = MyProcess('小白') p1.start()
二、关于join方法
join方法有什么用:
情况一:在主进程的任务与子进程的任务彼此独立的情况下,主进程的任务先执行完毕后,主进程还需要等待子进程执行完毕,然后统一回收资源
情况二:如果主进程的任务在执行到某一个阶段时,需要等待进程执行完毕后才能继续执行,就需要有一种机制能够让主进程检测进程是否运行完毕,
在子进程执行完毕后才继续执行,否则一直在原地阻塞.
举个例子:for循环创建子进程,并且主进程等待所有子进程执行完毕,才执行
import time from multiprocessing import Process def f1(): time.sleep(0.01) print('xxx') if __name__ == '__main__': p_list = [] #for循环创建子进程,并且主进程等待所有子进程执行结束,才继续执行 for i in range(10): p = Process(target=f1,) p.start() p_list.append(p) # p.join() for pp in p_list: pp.join() print('主进程结束')
三、多道技术:
产生的背景:多道技术产生的背景是第二代计算机的操作系统对cpu利用效率不高的状况
什么是多道技术:
多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(比如cpu)的有序调度问题,解决方式即多路复用,
多路复用分为时间上和空间上的多路复用.
空间上的复用:
将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有多道程序.
时间上的复用:
当一个程序i/o(阻塞)时,另一个程序可以使用cpu;一个进程占用cpu时间过长也会切换,或者说被操作系统夺走cpu的执行权限.
四、分时操作系统:
产生的背景:第二代计算机不能满足程序员们,在调试自己程序时,能很快可以得到响应.出现了分时操作系统.
什么是分时操作系统:
多个联机终端+多道技术
20个客户端同时加载到内存,有17个在思考,3个在运行,cpu就采用多道的方式处理内存中的这3个程序,由于客户提交的一般都是尖端的指令而且很少有耗时长的,
索引计算机能够为许多用户提供快速的交互式服务,所有的用户都以为自己独享了计算机的资源.
五、进程
什么是进程:
程序的运行过程. 正在进行的一个过程或者说一个任务,而负责执行任务则是cpu
什么是并发:
是伪并行,即:看起来是同时运行.(单个cpu+多道技术就可以实现并发)
什么是并行:
同时运行,只有具备多个cpu才能实现并行.
六、操作系统如何实现的并发(了解即可)
硬件中断一个正在运行的进程,把此时进程运行的所有状态保存下来,为此,操作系统维护一张表格,即进程表,每个进程占用一个进程表项(也称为进程控制块)
以此来保存进程由运行态转为就绪态或阻塞态时,必须保存的信息,从而保证该进程再次启动时,就像从而被中断过一样.
七、进程状态
在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。
1.同步异步
所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
其实就是一个程序结束才执行另外一个程序,串行的,不一定两个程序就有依赖关系。
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。
至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。
2.阻塞与非阻塞
阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)
等待消息通知时的状态角度来说的
3.同步/异步 与 阻塞和非阻塞
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 # 如何创建进程 2 from multiprocessing import Process 3 #如何创建线程 #进程和线程除了导入的模块和函数不一样外,其他方法都一样,例如下指令运行start,还有传参时的Thread(target=f1,args=(1,))和Process(target=f1,args=(1,)) 4 from threading import Thread 5 6 #如何创建进程池 7 #1. from concurrent.futures import ProcessPoolExecutor 8 #2. from multiprocessing import Pool 9 #如何创建线程池 #创建进程池和线程池除了导入的模块和函数不一样,其他方法,指令都一样 10 from concurrent.futures import ThreadPoolExecutor