适合用python完成的任务,python中实现多任务的方式有
在的第一篇博文中
1.1.什么是多任务,什么是“多任务”?简单来说,操作系统可以同时运行多个任务。比如你在用浏览器上网,听MP3,用Word赶作业。这是多重任务。至少有三个任务同时运行。还有很多任务同时在后台悄悄运行,只是没有显示在桌面上。
现在多核CPU很流行,但即使是过去的单核CPU也能执行多任务。既然CPU是顺序执行代码,那么单核CPU是如何执行多任务的呢?
答案是操作系统控制CPU轮流让各个任务交替执行。任务1执行0.01秒,切换到任务2,任务2执行0.01秒,然后切换到任务3,执行0.01秒.如此反复。从表面上看,每一个任务都是交替执行的,但是因为CPU的运行速度太快,我们感觉好像所有的任务都在同时执行。
真正的多任务并行执行只能在多核CPU上实现。但是因为任务的数量远大于CPU的核数,所以操作系统会自动将很多任务依次调度给每个核。
1.2.并发和并行并发:指任务数超过cpu核数。通过操作系统的各种任务调度算法,可以“一起”执行多个任务(其实有些任务是不执行的,因为任务切换的速度挺快,看起来是一起执行的)。并行性:指任务数小于等于cpu核数,即任务真正一起执行。1.3.CPU执行程序原理相关术语。
RAM:指内存,掉电后无法保存,故称为易失性存储;另一个相关的概念是ROM,一般指外部存储,比如硬盘。RAM的速度比ROM快很多,CPU直接和内存交换数据。
CPU:计算机的所有计算操作都是由它来完成的,记住它是一个有输入输出的集成电路就行了。
指令:指令是CPU操作的基本单位,大致包括操作对象,操作对象的地址,对操作对象执行什么样的操作。
RAM相关结构
如果一个程序要被CPU执行,首先要被编译成CPU可以执行的指令操作,这里就不详细描述了。本文假设程序已经被编译并放入内存。存储在存储器中的数据可以分为两类,一类是指令;另一个是数据,指令和数据都有对应的地址。
下图是我们接下来要讨论的内存结构。
在上图中,现在已经存储了地址为100、104、108、112的一系列指令;地址为2000年、2004年和2008年的一系列数据。
CPU相关结构
这里只发布CPU执行指令涉及的基本结构,真实情况会复杂很多。
这里涉及的结构包括程序计数器、指令寄存器、数据寄存器和ALU,可以简单理解为存储数据的器件。用于存储指令的程序计数器的地址;寄存器是用来存储指令的(初学者可能会混淆数据和地址的区别,稍微区分一下就能分辨出来);数据寄存器存储计算中涉及的数据。下图中的a、B、C都是数据寄存器;ALU是用于计算的设备。
执行过程
为了便于理解,只涉及CPU和内存之间的数据交换。
了解了RAM和CPU的相关结构后,我们就可以正式开始解释执行过程了,其实就是以上描述的组合。
1.程序计数器的初始内容是100,指向内存中的某条指令。注意100指的是地址;2.指令寄存器根据程序计算器的指向地址,将内存中地址为100的指令捕捉到自己,此时存储LOAD A,2000;3.CPU根据指令内容将内存地址为2000的数据上传到数据寄存器A。此时CPU和RAM的状态如下图所示;
以上三个步骤完成了一条指令的基本操作步骤。接下来,程序计数器依次指向104指令地址、108指令地址和112指令地址,分别完成2004地址的数据向B数据寄存器的赋值;将ALU A和B中的数据相乘并赋值给C数据寄存器;将C数据寄存器数据写入内容地址2008。
这样就完成了简单程序500.1的计算。最后,CPU和RAM的状态如下图所示。
1.4.程序、进程和线程程序是包含指令和数据的文件,存储在磁盘或其他数据存储设备中,也就是说,程序是静态代码。进程是程序的一个执行过程,是系统运行程序的基本单元,所以进程是动态的。在一个系统中运行一个程序,是一个从创建、运行到消亡的过程。简单来说,进程就是一个正在执行的程序,在计算机中执行一条又一条指令。同时,每个进程还会占用一些系统资源如CPU时间、内存空间、文件、输入输出设备的使用权等等。换句话说,当程序执行时,它会被操作系统加载到内存中。类似于线程进程,但线程是比进程更小的执行单元。一个进程在执行过程中可以生成多个线程。与进程不同,同一种类的多个线程共享相同的内存空间和一组系统资源。因此,当系统生成一个线程或者在线程之间切换时,负担要比进程小得多。正因为如此,线程也被称为轻量级进程。在执行过程中,进程拥有独立的内存单元,而多个线程共享内存,大大提高了程序的运行效率。
1.5.一个故事讲完之后的流程,脉络,协同。很久以前,有两个程序。我们暂且称他们为王采和萧蔷。
王采和萧蔷都是非常长的程序,每个都超过100,000行。他们的人生价值就是在CPU上运行,把运行结果告诉人类。
CPU是一种稀缺资源。只有一个CPU,他们要排队轮流用。
王采从头到尾都完成了执行,放弃了CPU,让萧蔷从头开始做。
人类称这种加工方式为批量加工(单工序)。
过程
很长一段时间,两人相安无事。后来CPU的速度越来越快,远远超过内存和硬盘的速度。
人类认为这些处理系统的效率有点低。看,当萧蔷需要从硬盘中读取数据时,CPU一直在等待。真是浪费!在这个时候,你可以让王采运行它!
当然,需要保留萧蔷的执行地点:具体执行了哪一行程序指令,进行了什么级别的函数调用,每个函数调用有什么样的参数,CPU寄存器中的值等等。
如果萧蔷的执行地点没有被保留,当萧蔷的数据从银盘中读取时,就没有办法回到中断处继续执行。
这个执行点和萧蔷的代码一起,是一个被称为“进程”的执行程序。
当王采和萧蔷在运行时,它们也被转化为过程。
人类还规定一个进程不能长时间占用CPU,只能在CPU上短时间执行,然后马上切换到另一个进程执行。
王采和萧蔷都不以为意:就表演一会儿,休息一会儿,然后继续表演!
但他们不知道的是,因为超快的CPU速度,虽然王采和萧蔷在不停地切换操作,但在人类的慢世界里,王采和萧蔷仿佛是同时在执行。这就是并发。
(在人类眼中,小强和王采似乎同时在执行)
很多年后,他们两个真正实现了并行:在一台豪华电脑里,每个人都分配了一个CPU,真正同时执行,这是另一个故事(多核)。
线
此时,王采已经有了一个接口,可以访问网络。每当它连接到互联网时(这也是一个非常非常耗时的操作),它必须将CPU交给萧蔷。
即使王采再次被执行死刑,因为网络数据还没有返回,他只能等待,什么也做不了。在人类眼里,界面根本无法操作,王采没有反应!人类经常杀旺财,我很生气。
财富是痛苦的,他想知道为什么萧蔷没有问题。萧蔷不是要读写硬盘吗?那也是个慢操作。
萧蔷说,“你真笨。里面只有一个执行过程,遇到耗时的操作就要等待。看着我。里面有两个执行进程(线程),一个是读写硬盘(T1),一个是处理接口(T2)。我和操作系统商量过,如果T1在读写硬盘,我可以调度我的T2去执行,这样至少可以操作界面。”
王采觉得很有趣,采取了类似的方法。
因此,一个进程中至少有一个正在执行的进程(主线程),也可以启动一个新的正在执行的进程(线程)。
线程成为最小的调度单元。
协同程序
这一天,王采被一个叫做生产者和消费者的问题所困扰。两个线程,其中一个将数据放入队列,另一个从队列中取出数据,这使得处理两个线程之间的合作非常麻烦。它不仅需要被锁定,还需要被线程通知和等待。
在感受多线程编程的困难时,王采震惊地发现,萧蔷用一种非常简单的方法解决了生产者和消费者的问题。
该方法的代码如下:
#制作人
定义生产者(c):
#其他代码
虽然正确:
值=.生成数据.
c .发送(值)
#消费者
定义消费者():
#其他代码
虽然正确:
价值=产量
打印(值)
c=消费者()
制片人(丙)“这是怎么回事.这是怎么执行的?那收益率是怎么回事?”王采迷惑不解。
“简单。看那个制片人。他把数据发给消费者了吗?”萧蔷说。
“对,然后,生产者发送数据后,会不会马上进行下一个周期?”
“这是关键,”萧蔷说。"它们是这样被执行的:"
生产者发送数据,停止运行,不进行下一个循环(可以理解为进入消费者函数yield的位置继续执行)
事实上,消费者一直在等待价值=收益率,直到数据到来。现在数据来了就拿出来处理(value是生产者发来的数据)。
在消费者循环中再次让步,并暂停执行(再次自动切换回生产者函数)。
生产者继续下一个循环,生成新的消息并将其发送给消费者。
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。