Python中的多任务--进程和多线程

摘至本人有道云笔记《Python中的多任务--进程和多线程》

1.什么是多任务--进程

简单地说,就是操作系统可以同时运行多个任务。对于操作系统来说,一个任务就是一个进程。

关于多任务的调度

时间片调度:各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再 切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

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

多任务可以由多进程完成,也可以由一个进程内的多线程完成。

 

2.什么是线程

线程是操作系统中能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

一个线程指的是进程中一个单一顺序的控制流。

一个进程中可以并发多条线程,每条线程并行执行不同的任务。

多线程的理解

多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦。

 

3.如何同时执行多个任务?

1)启动多个进程

2)启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。

3)启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用

多任务的实现有3种方式:

  • 多进程模式;

  • 多线程模式;

  • 多进程+多线程模式。

同时执行多个任务通常各个任务之间并不是没有关联的,而是需要相互通信和协调 Queue()

 

4.进程和线程的区别

1)运行方式不同

      • 进程不能单独执行,它只是资源的集合。

      • 进程要操作CPU,必须要先创建一个线程。

      • 所有在同一个进程里的线程,是同享同一块进程所占的内存空间

2)关系

      • 进程中第一个线程是主线程,主线程可以创建其他线程;其他线程也可以创建线程;线程之间是平等的。

      • 进程有父进程和子进程,独立的内存空间,唯一的标识符:pid。

      • 线程共享内存空间,进程的内存是独立的。

3)交互

      • 同一个进程里的线程之间可以直接访问。

      • 两个进程想通信必须通过一个中间代理来实现。

      • 一个线程可以控制和操作同级线程里的其他线程,但是进程只能操作子进程

 

5.什么的并发和并行?

并发:微观上CPU轮流执行,宏观上用户看到同时执行。因为cpu切换任务非常快。

           进程数大于CPU核数

并行:是指系统真正具有同时处理多个任务(动作)的能力。

           进程小于CPU核数

多线程属于高并发

 

6.同步、异步和轮询的区别?

同步任务:B一直等着A,等A完成之后,B再执行任务。(打电话案例)

轮询任务:B没有一直等待A,B过一会来问一下A,过一会问下A

异步任务:B不需要一直等着A, B先做其他事情,等A完成后A通知B。(发短信案例)常用

 

7.计算密集型任务和IO密集型任务

是否采用多任务的第二个考虑是任务的类型。我们可以把任务分为计算密集型和IO密集型。

第一种计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

第二种:任务的类型是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

 

计算密集型任务,应该使用Python 多进程

IO密集型任务,应使用多线程

2018/08/02 16:23

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值