单核实现并发的效果
看起来像同时运行的就可以称之为并发
真正意义上的同时执行
并行肯定算并发
单核的计算机不能实现并行,但是可以实现并发!!!
补充:我们直接假设单核就是一个核,干活的就一个人,不要考虑cpu里面的内核数
ps:明星出轨 ----> 星轨
节省多个程序运行的总耗时。
![]()
空间上的复用和时间上的复用
空间上的复用
多个程序公用一套计算机硬件
时间上的复用
例子:洗衣服30s,做饭50s,烧水30s
单道需要110s,多道只需要任务最长的那一个 节省切换时间
例子:边吃饭边玩游戏 保存状态
切换(cpu)分为两种情况:
1、当一个程序遇到IO操作的时候,操作系统会剥夺该程序的cpu执行权限<br></br> 作用:提高了CPU的利用率,也不影响程序的执行效率<br></br> 2、当一个程序长时间占用CPU的时候,操作系统也会剥夺该程序的CPU执行权限<br></br> 作用:降低了程序的执行效率(原本时间+切换时间)
程序就是一堆躺在硬盘上的代码,是‘死’的
进程则表示程序正在执行的过程,是‘活’的
先来先服务调度算法
特点:对长作业有利,对短作业无益
短作业优先调度算法
特点:对短作业有利,多长作业无益
时间片轮转法+多级反馈队列
![]()
![]()
![]()
同步和异步
描述的是任务的提交方式<br></br>同步:任务提交之后,原地等待任务的返回结果,期间等待的过程中不做如何事情(干等)<br></br> 程序层面上表现出来的感觉就是卡住了<br></br><br></br>
异步:任务提交之后,不原地等待任务的返回结果,直接去做其他事情<br></br> 我提交的任务结果如何获取?<br></br> 任务的返回结果会有一个异步回调机制自动处理
阻塞非阻塞
描述的是程序的运行状态<br></br>阻塞:阻塞态<br></br>非阻塞:就绪态、运行态<br></br><br></br>理想状态:我们应该让我们写的代码永远处于就绪态和运行态之间切换
上述概念的组合:最高效的一种组合就是异步非阻塞
定心丸:代码开启进程和线程的方式,代码书写基本是一样的,你学会了如何开启进程就学会了如何开启线程
方式一:
# 第一种
from multiprocessing import Process
import time
def task(name):
print("%s is running" % name)
time.sleep(3)
print('%s is over' % name)
if __name__ == '__main__':
# 1、创建一个对象
p = Process(target=task, args=('jason',))
# 容器类哪怕里面有一个元素,建议一定要用逗号隔开
# 2、开启进程
p.start() # 告诉操作系统帮你创建一个进程 异步
print('主')
'''
windows操作系统下 创建进程一定要在main内创建
因为windows下创建进程类似于模块导入的方式
会从上往下依次执行代码
linux中则是直接将代码完整的拷贝一份
'''
方式二:
# 第二中方式 类的继承
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print('hello world')
time.sleep(1)
print('get out!')
if __name__ == '__main__':
p = MyProcess()
p.start()
print('主')
总结:
创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去
一个进程对应在内存中就是一块独立的内存空间
多个进程对应在内存中就是多块独立的内存空间
进程与进程之间数据默认情况下是无法直接交互,如果想交互可以借助于第三方模块,工具
join是让主进程等待子进程代码运行结束之后,再继续运行。不影响其他子进程的执行
from multiprocessing import Process
import time
def task(name,n):
print("%s is running" % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
# 方式一:
1、创建一个对象
p1 = Process(target=task, args=('jason',1))
p2 = Process(target=task, args=('egon',2))
p3 = Process(target=task, args=('tank',3))
# 容器类哪怕里面有一个元素,建议一定要用逗号隔开
# 2、开启进程
start_time = time.time()
p1.start() # 告诉操作系统帮你创建一个进程 异步
p2.start()
p3.start() # 仅仅是告诉操作系统要创建进程
# p.join() # 主进程等待子进程p运行结束之后在继续往后执行
p1.join()
p2.join()
p3.join()
print('主',time.time() - start_time)
# 方式二:
start_time = time.time()
p_list = []
for i in range(1,4):
p = Process(target=task,args=('子进程%s'%i,i))
p.start()
p_list.append(p)
for p in p_list:
p.join()
print('主', time.time() - start_time)
from multiprocessing import Process
money = 100
def task():
global money # 局部修改全局
money = 666
print('子',money)
if __name__ == '__main__':
p = Process(target=task)
p.start()
p.join()
print(money)
# 子 666
# 100
声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。
本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。
我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
微信扫码关注 HaowuliaoA 订阅号