单道:一条道走到黑
多道:(!!!)
并发:
指的是看起来像同时在运行,多个程序不停 切换+保存状态
在单核(一个CPU)情况下,当执行两个a,b程序时,a先执行,当a遇到IO时,b开始争抢cpu的执行权限,再让b执行,他们看起像同时运行。
并行:
真正意义上的同时运行,在多核(多个CPU)的情况下,同时执行多个程序
在多核(多个cpu)的情况下,当执行两个a,b程序时,a与b同时执行。他们是真正意义上的同时运行。
进程是一个资源单位
程序:一对代码文件
进程:执行代码的过程,称之为进程
现代操作的系统进程调度算法:时间片轮转法 + 多级反馈队列 (知道)
同步与异步,指的是“提交任务的方式”。
同步:
两个a,b程序都要提交并执行,假如a先提交执行,b必须等a执行完毕后,才能提交任务。
异步:
两个a,b程序都要提交并执行,假如a先提交并执行,b无需等a执行完毕,就可以直接提交任务。
阻塞(等待):
凡是遇到IO都会阻塞
IO:input()
output()
time.sleep(3)
文件的读写
数据的传输
非阻塞(不等待):
除了IO都是非阻塞(比如:程序长时间执行)
就绪态:
同步与异步
运行态:(程序的执行时间过长,会将程序返回给就绪态。)
指的是非阻塞的状态都是运行态
阻塞态:
指的是遇到IO时的状态
面试题:阻塞与同步是一样的吗?非阻塞与异步是一样的吗?
同步与异步 指的是提交任务时的方法
阻塞与非阻塞 指的是进程的状态
异步非阻塞:cpu的利用率最大化!
第一种:
from multiprocessing import Process
import time
# 方式一:直接调用Process
def task(name):
print(f‘start...{name}的子进程‘)
time.sleep(3)
print(f‘end....{name}的子进程‘)
# target=任务(函数地址) ---> 创建一个子进程
# 异步提交了三个任务
# p_obj1 = Process(target=task, args=(‘jason_sb‘,))
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.start() # 告诉操作系统,去创建一个子进程
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
# p_obj1.join() # 告诉主进程,等待子进程结束后,再结束
#
# p_obj2 = Process(target=task, args=(‘sean_sb‘,))
# p_obj2.start() # 告诉操作系统,去创建一个子进程
# p_obj2.join() # 告诉主进程,等待子进程结束后,再结束
#
# p_obj3 = Process(target=task, args=(‘大饼_sb‘,))
# p_obj3.start() # 告诉操作系统,去创建一个子进程
# p_obj3.join() # 告诉主进程,等待子进程结束后,再结束
# print(‘正在执行当前主进程...‘)
list1 = []
if __name__ == ‘__main__‘:
for line in range(10):
p_obj = Process(target=task, args=(‘我是进程‘,))
p_obj.start()
list1.append(p_obj)
for obj in list1:
obj.join()
print(‘主程序‘)
第二种实现方式
# 方式二:
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print(f‘start...{self.name}的子进程‘)
time.sleep(3)
print(f‘end...{self.name}的子进程‘)
if __name__ == ‘__main__‘:
list1 = []
for line in range(10):
obj = MyProcess()
obj.start()
list1.append(obj)
for obj in list1:
obj.join()
print(‘主进程...‘)
强调:在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。所以必须把创建子进程的部分使用if __name **==‘__main**’
判断保护起来,import 的时候 ,就不会递归运行了。
原文:https://www.cnblogs.com/cnhyk/p/12000700.html