Python进程、线程、协程

详情戳击下方连接javascript

学习进程、线程、协程,引伸一些内容html

  为何要学习进程和线程:java

  进程和线程目的是为了:提升执行效率python

现代操做系统好比Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操做系统。程序员

什么叫“多任务“呢?简单地说,就是操做系统能够同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶做业,这就是多任务,至少同时有3个任务正在运行。还有不少任务悄悄地在后台同时运行着,只是桌面上没有显示而已。浏览器

如今,多核CPU已经很是普及了,可是,即便过去的单核CPU,也能够执行多任务。因为CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?网络

答案就是操做系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每一个任务都是交替执行的,可是,因为CPU的执行速度实在是太快了,咱们感受就像全部任务都在同时执行同样。多线程

真正的并行执行多任务只能在多核CPU上实现,可是,因为任务数量远远多于CPU的核心数量,因此,操做系统也会自动把不少任务轮流调度到每一个核心上执行。并发

对于操做系统来讲,一个任务就是一个进程(Process),好比打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。异步

有些进程还不止同时干一件事,好比Word,它能够同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就须要同时运行多个“子任务”,咱们把进程内的这些“子任务”称为线程(Thread)。

因为每一个进程至少要干一件事,因此,一个进程至少有一个线程。固然,像Word这种复杂的进程能够有多个线程,多个线程能够同时执行,多线程的执行方式和多进程是同样的,也是由操做系统在多个线程之间快速切换,让每一个线程都短暂地交替运行,看起来就像同时执行同样。固然,真正地同时执行多线程须要多核CPU才可能实现。

咱们前面编写的全部的Python程序,都是执行单任务的进程,也就是只有一个线程。若是咱们要同时执行多个任务怎么办?

有两种解决方案:

一种是启动多个进程,每一个进程虽然只有一个线程,但多个进程能够一块执行多个任务。

还有一种方法是启动一个进程,在一个进程内启动多个线程,这样,多个线程也能够一块执行多个任务。

固然还有第三种方法,就是启动多个进程,每一个进程再启动多个线程,这样同时执行的任务就更多了,固然这种模型更复杂,实际不多采用。

总结一下就是,多任务的实现有3种方式:

  • 多进程模式;
  • 多线程模式;
  • 多进程+多线程模式。

同时执行多个任务一般各个任务之间并非没有关联的,而是须要相互通讯和协调,有时,任务1必须暂停等待任务2完成后才能继续执行,有时,任务3和任务4又不能同时执行,因此,多进程和多线程的程序的复杂度要远远高于咱们前面写的单进程单线程的程序。

由于复杂度高,调试困难,因此,不是无可奈何,咱们也不想编写多任务。可是,有不少时候,没有多任务还真不行。想一想在电脑上看电影,就必须由一个线程播放视频,另外一个线程播放音频,不然,单线程实现的话就只能先把视频播放完再播放音频,或者先把音频播放完再播放视频,这显然是不行的。

Python既支持多进程,又支持多线程,咱们会讨论如何编写这两种多任务程序。

小结

线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,彻底由操做系统决定,程序本身不能决定何时执行,执行多长时间。

多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。

总之一句话,具体案例具体分析。须要根据实际的状况,精准的定位问题的所在,而不会盲目去作方案

并发 & 并行

并发 : 是指系统具备处理多个任务(动做)的能力

并行 : 是指系统具备 同时 处理多个任务(动做)的能力

并行是否是并发的一个子集

同步 与 异步

同步: 当进程执行到一个IO(等待外部数据)的时候,------等:同步
异步: ------不等:一直等到数据接收成功,再回来处理


任务: IO密集型
计算密集型

对于IO密集型的任务 : python的多线程的是有意义的
能够采用多进程+协程

对于计算密集型的任务: python的多线程就不推荐,python就不适用了。固然了能够用进程,也能够改C

俩种任务为什么有不一样的针对性,在学习完进程、线程结束以后就会知道为什么这样了

 进程不是越多越好,线程天然也不是越多越好,具体案例具体分析,请求上下文耗时

计算机操做系统发展史

简单来讲,能够概述说计算机一共发展了四代

为何要有操做系统?

复制代码
现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各类其余输入
   输出设备组成的复杂系统,每位程序员不可能掌握全部系统实现的细节,而且管理优化这些部件是一件挑战性极强
   的工做。因此,咱们须要为计算机安装一层软件,成为操做系统,任务就是用户程序提供一个简单清晰的计算机模
   型,并管理以上全部设备。

   定义也就有了:操做系统是一个用来协调、管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间。

              (程序是运行在系统上的具备某种功能的软件,好比说浏览器,音乐播放器等。)

    操做系统的内核的定义:操做系统的内核是一个管理和控制程序,负责管理计算机的全部物理资源,其中包括:文件系
    统、内存管理、设备管理和进程管理。
复制代码

1、真空管与穿孔卡片(无操做系统)

复制代码
过程:

    万能程序员们将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,而后启动输入机把程序和数据输入计算机
    内存,接着经过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或
    卡片)后,才让下一个用户上机。

    注意点:
程序员须要在墙上的计时表上预定时间 
同一时刻只有一个程序在内存中被CPU调用运行(串行的)

    优缺点:

    优势:程序员在申请的时间段内独享整个资源,即时的调试本身的程序,若是有bug能够当场处理,
    缺点:这对于计算机提供商来讲是一种浪费(你买一台电脑4000块,那 一年中你用365比只用1天,确定是省成本的,
    物尽其用)
复制代码

2、晶体管和批处理系统

复制代码
一代计算机的问题:

    人机交互太多了(输入--->计算--->输出  输入--->计算--->输出 输入--->计算--->输出 )

    解决办法:
        把一堆人的输入攒成一大波输入,而后顺序计算(这是有问题的,可是第二代计算没有解决)再把计算结果攒成
        一大波输出,这就是批处理系统


    操做系统前身:

    在收集了大约一个小时的批量做业以后,这些卡片被读入磁带,而后磁带被送到机房里并装到磁带上。而后磁带被送到
    机房里并装到磁带机上。随后,操做员装入一个特殊的程序(此乃现代操做系统的前身),它负责从磁带上读入第一个
    做业(job,一个或一组程序)并运行,其输出写到第二个磁带上,并且不打印。每一个做业结束后,操做系统自动的从
    磁带上读入下一个做业而且运行。当一整批的做业所有结束后,操做员去下输入和输出磁带,讲输入磁带换成下一批做
    业,而且把输出磁带拿到一台1041机器上进行脱机(不与主计算机联机)打印

    优势:批处理
    缺点: 1 图的中间还有俩小人  2 仍然是顺序计算
复制代码

 

3、集成电路芯片和多道程序设计

复制代码
针对二代计算机的两个主要问题

    开发出SPOOLING技术:
    卡片被拿到机房后可以很快的将做业从卡片读入磁盘,因而任什么时候刻当一个做业结束时,操做系统就能将一个做业从磁
    带读出,装进空出啦的内存区域运行,这种技术叫作同时的外部设备联机操做:SPOOLING该技术同时用于输出。当采
    用了这种技术后,就不在须要IBM1401机了,也没必要将磁带搬来搬去了(中间俩小人失业了),强化了操做系统的功能

    开发出多道程序设计,用于解决顺序执行的问题:

    在7094机上(程序运行的机器),若当前做业因等待磁带或等待其余IO操做而暂停,CPU就处于休闲状态直至IO操做
    完成,对于CPU密集的科学计算,IO操做少,浪费时间不明显,对于商业数据处理,IO等待能到达80%~90%,因此必
    须解决CPU浪费的现象。

    解决方案:将内存分为几个部分,每一部分存放不一样的做业,如图1-5所示。当一个做业等待IO完成时,另外一个做业能够
    使用CPU,内存中放足够的做业,则CPU的利用率能接近100%

    此时的第三代计算机适合大型科学计算和繁忙的商务数据处理,但,本质上其还是一个批处理系统。
    虽然解决了诸如以上问题,但多个做业必须在所有运行结束后,才能获得结果,从一个做业的提交到运算结果取回每每
    长达数小时。
    想象一个场景:A君 B君 C君 三个程序员同时在调试程序,一旦A君写错一个逗号,那么可能须要半天的时间才能看到结
    果,由于B君C君的结果也同时运算出来了。时间必然要长。一言以蔽之:你们一块儿存做业,你们一块儿去数据(磁带)

    许多程序员怀念第一代独享的计算机,能够即时调试本身的程序。为了知足程序员们很快能够获得响应,出现了分时操做系统
    
    分时操做系统:多个联机终端+多道技术

    20个客户端同时加载到内存,有17在思考,3个在运行,cpu就采用多道的方式处理内存中的这3个程序,因为客户提交的通常
    都是简短的指令并且不多有耗时长的,索引计算机可以为许多用户提供快速的交互式服务,全部的用户都觉得本身独享了计
    算机资源
复制代码

4、我的计算机

    随着大规模集成电路的发展,每平方厘米的硅片芯片上能够集成数千个晶体管,我的计算机的时代就此到来。

5、须要知道的东西

每一个cpu都有其一套可执行的专门指令集,如SPARC和Pentium,其实每一个硬件之上都要有一个控制程序,cpu的指令集就是cpu的控制程序。

内核态于与用户态指的是计算机的两种工做状态
即cpu的两种工做状态
(如今的操做系统都是分时操做系统,分时的根源来自于硬件层面操做系统内核占用的内存与应用程序占用的内存彼此之间隔离)
cpu经过psw(程序状态寄存器)中的一个2进制位来控制cpu自己的工做状态,即内核态与用户态。
内核态:操做系统内核只能运做于cpu的内核态,这种状态意味着能够执行cpu全部的指令,能够执行cpu全部的指令,这也意味着对计算机硬件资源有着彻底的控制权限,而且能够控制cpu工做状态由内核态转成用户态。

用户态:应用程序只能运做于cpu的用户态,这种状态意味着只能执行cpu全部的指令的一小部分(或者称为全部指令的一个子集),这一小部分指令对计算机的硬件资源没有访问权限(好比I/O),而且不能控制由用户态转成内核态.

相关文章
相关标签/搜索