#进程是程序的运行,程序不运行不产生进程。 #1、进程的并行与并发: # 并行:是指两者同时执行,比如赛跑,两人都在不停的往前跑。(资源够用,比如三个线程,四核的cpu) # 并发:是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核cpu)只能同时过一个人,A走一段路之后,让给B, # B用完之后继续给A,交替使用,目的是提高效率。 #2、进程的状态:就绪 运行 阻塞 # (1)就绪(Ready)状态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。 # (2)执行/运行(Running)状态:当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。 # (3)阻塞(Blocked)状态:正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。
#3、同步和异步: # 比如我去银行办理业务,可能会有两种方式: # 同步 :选择排队等候;一边排队一边等候消息通知,排队和等候是同步进行的。 # 异步 :选择取号,等到排到我这一号时由柜台的人通知我轮到我去办理业务; # 就是异步等待消息通知。在异步消息处理中, # 等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制, # 在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。 #4、阻塞和非阻塞: # 阻塞:继续上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中, # 等待者除了等待消息通知之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中, # 也就是该程序一直阻塞在该函数调用处不能继续往下执行。 # 非阻塞:相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待, # 这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。 #5、同步、异步、阻塞、非阻塞: # 1、同步阻塞:效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。 # 2、异步阻塞:如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是取了号, # 假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面; # 异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。 # 3、同步非阻塞:效率最低。想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有, # 如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换, # 效率可想而知是低下的。 # 4、异步非阻塞:效率更高,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情, # 程序没有在两种不同的操作中来回切换。比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说, # 排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面, # 自然这个就是异步+非阻塞的方式了。 #6、进程的创建:创建进程就是让程序运行起来,所有进程(子进程)都是被其他进程(父进程)创建出来的。 # 7、 import os import time print(os.getpid()) #获取当前运行的python程序的进程id:process id print(os.getppid()) #获取当前进程的父id:parent process id time.sleep(100) #睡眠是为了在 任务管理器 的详细信息当中看到上面两进程的pid,否则上面两进程运行完 #是瞬间的事情,无法看到pid。
# 8、multiprocess是综合处理进程的模块。multi 多元的、综合的,process进程: from multiprocessing import Process import os def func(): print('子进程', os.getpid()) print(123) if __name__ == '__main__': #创建的进程要放在此语句里面。 p = Process(target=func) #创建一个进程对象。实例化对象=类() print('主进程',os.getpid()) p.start() #告诉操作系统我要开始一个进程,至于操作系统什么时候调度,无法知道,所以先执行下面的代码。 print('主进程', os.getpid()) #执行结果是:主进程 12164 # 主进程 12164 # 子进程 21952 # 123