内容概括:
一:单道与多道技术
二:进程与程序
三:并发与并行
四:同步与异步
1、什么是单道?什么是多道技术?
单道和多道其实都是一种cpu运行程序的方式
-单道:指的是cpu从头到尾将一个程序执行完后,才能执行另外一个程序
-多道:当一个程序执行时遇到阻塞,cpu空闲下来时,cpu会被调度到其它程序的运行中,提高cpu运行效率,可以近似实现多个程序同时执行
多道与单道图解:
cpu切换的三种方式:
-当一个进程遇到阻塞时——time.sleep(),input(),文件操作(本质为线程遇到io)
-提高了cpu的利用率
-当一个进程执行时间过长时(本质为线程执行时间过长)
-增加了cpu切换进程所用时间,降低了执行效率,但能避免一个程序执行时间过长,导致其它进程无法运行
-当有一个优先级更高的进程要开启时
-降低了执行效率,保证了用户的使用体验
ps:cpu的切换是操作系统强制执行的
cpu执行程序的三状态图
cpu调度算法
-先进先执行算法:
对长作业有利,对短作业不利
-短作业优先算法:
对短作业有利,对长作业无益,无法实现并发效果
-时间片轮转法与多级反馈队列:
多个进程同时执行,会被cpu执行相同时间(一个时间片,假设为3秒),三秒之间,进程A执行完毕,资源释放;三秒后,进程B与C未完成,进入下一个时间片(假设为2秒),在这两秒内,进程B执行完毕,资源释放。进程C未完成进入下一个时间片(假设时间为1秒),最后一秒内,进程C执行完毕,资源释放。
需要注意的是,时间片越往下优先级越低,如果在进程A结束,进程B与进程C还在第二个时间片运行时,启动了新的进程,新的进程会被放入第一层时间片,cpu会抛弃进程B与C,优先执行新进程
图解
2、什么是进程?什么是程序?
-程序是“死”的,指的是存储在硬盘上一串关联的代码
-进程是“活”的,指的是将硬盘上的程序代码提取到内存中运行的代码
ps:程序与进程的概念并不严格,通常,程序可以指进程。
开启进程的两种方式:
一:
from multiprocessing import Process def task(number): print('子进程{}下任务'.format(number)) p = Process(target = task, args=("2",)) p.start() # 向操作系统发送请求 print('主')
二:利用类的继承与run方法(不常用)
from multiprocessing import Process class MyProcess(Process): def run(self): print('你好') if __name__ == '__main__': p = MyProcess() p.start() print('世界')
注意:windows系统下,必须在执行进程前加入 if __name__ == “__main__”语句,否则会报类似循环导入的错误
python开启进程的方式类似于模块导入,也就是将主文件的代码执行一份,放到一个新的内存空间中,如果没有上面的语句,子进程也能开启自己的进程,导致类似的循环导入
所以必须进程主从文件的判断
进程的join方法:
要想主文件语句在子进程执行结束之后再执行,就要使用join方法
以上述代打为准,看一下没有join语句会发生什么?
执行结果:
世界
你好
原因参考同步异步
加入join后:
from multiprocessing import Process class MyProcess(Process): def run(self): print('你好') if __name__ == '__main__': p = MyProcess() p.start() p.join() print('世界')
执行结果:
你好
世界
题目1:
from multiprocessing import Process import time def task(i, t): print('任务开始{}'.format(i)) time.sleep(t) print('任务结束{}'.format(i)) if __name__ == '__main__': p1 = Process(target=task, args=('1', 1,)) p2 = Process(target=task, args=('1', 2,)) p3 = Process(target=task, args=('1', 3,)) start_time = time.time() p1.start() p2.start() p3.start() p1.join() p2.join() p3.join() end_time = time.time() print('结束时间为{}'.format(end_time - start_time))
题目2:
from multiprocessing import Process import time def task(i, t): print('任务开始{}'.format(i)) time.sleep(t) print('任务结束{}'.format(i)) if __name__ == '__main__': start_time = time.time() for i in range(1,4): p = Process(target=task,args=(str(i),i)) p.start() p.join() end_time = time.time() print('结束时间为{}'.format(end_time - start_time))
让主进程等待多个进程结束再执行的正确方式
from multiprocessing import Process import time def task(i, t): print('任务开始{}'.format(i)) time.sleep(t) print('任务结束{}'.format(i)) if __name__ == '__main__': start_time = time.time() p_list = [] for i in range(1, 4): p = Process(target=task, args=(str(i), i)) p.start() p_list.append(p) for p in p_list: p.join() end_time = time.time() print('结束时间为{}'.format(end_time - start_time))
3、并行与并发的区别
-并发:多个进程看似同时执行
并发也可以理解为 切换 + 保存状态(是系统执行调度的最小单位)
-并行:真正意义上多个进程同时执行(只有多核情况下,每一个线程都分配一个cpu,才可以称之为并行)
4、同步与异步
同步与异步是两种不同的任务提交方式,或者说是执行代码的两种不同方式
-同步:代码依次运行,当提交一个任务时,后续代码必须等待任务执行完毕,并返回结果后才继续执行
import time def task(): time.sleep(5) print('任务执行并返回结果') if __name__ == '__main__': task() print('等待任务执行完后才执行')
-异步:在没有遇到阻塞时,主文件代码一直执行,提交的任务会单独开辟内存空间和分配资源,独立执行
异步提交的任务执行的结果,会利用异步回调机制进行处理
from multiprocessing import Process def task(): print('任务执行并返回结果') if __name__ == '__main__': p = Process(target=task,) p.start() print('任务没执行完,这段代码就执行了')
今天的文章多进程_多进程处理是什么意思分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/53977.html