适合用python完成的任务,python中实现多任务的方式有

  适合用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: