自学python实例_总结线程进程协程

1.共同的作用

就是实现多任务,在同一时间,可以同时做多件事情,就比如你在电脑上可以同时上qq,同时听音乐~

2.并发和并行

虽然说,你可以在电脑上同时上qq和同时听音乐,看似你电脑正在完成多任务,但是实际上,你的电脑还是按顺序的一个一个执行任务的,让你感觉到多任务是错觉,因为电脑的运行速度实在是太快啦!

如果说要真正的多任务,一个cup完成一个任务,两个cup完成两个任务,多核cpu完成多个任务,好像只要你的cpu够多,就可以完成多任务了?

不是的,你可以打开你的任务管理器,看看你电脑的后台有多个进程在运行吧!现在的电脑大多都是双核或者四核的吧,至少我家电脑现在还是双核T.T,所以,下面就要引出并发和并行的概念了!

  • 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
  • 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的.

所以多,基本上都是处于并发状态下的运行方式.

3.什么是线程?

为了实现线程,我们可以使用threading模块(使用方法也简单,这里我就不说了),需要注意的是,线程的全局变量共享的,我们可以理解成一条生产线,a负责放东西,b负责装东西等等...总的东西是共享的,但是你们都同时在做一件事情!.

线程中,有一个加 互斥锁 的概念,就是多个线程,都同时需要对一个全局变量进行修改的时候,如果没有先后顺序的话,不同的操作系统可能就会有不同的结果,所有就有了互斥锁.

# 创建锁
mutex = threading.Lock()
# 锁定
mutex.acquire()
# 释放
mutex.release()

即a负责放东西,b负责装东西,加了锁之后,必须等a完成之后,b才能继续装东西,后面以此类推,这样就保证了一整个过程不会混乱了.

但是这样,就会产生一个新的东西,叫死锁,就是在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。即,你在等他先,他在等你先,你们就僵住了.

4.什么是进程?

进程,大家看到都见过,当我们一个程序未响应卡住的时候,我们就会打开任务管理器,然后结束这个进程,那么进程到底是什么呢?

进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。所以不仅可以通过线程完成多任务,进程也是可以的.

进程的创建可以使用multiprocessing,使用起来也比较简单,我们需要知道的是,进程的多任务创建,相当于,复制了一个完全一模一样占了相同资源的程序,一起运行,并且他们是不共享全局变量的,如果需要传递变量,可以使用queue方法进行传递.

我们可以理解成,一个工厂为提高效率,他又多开了一个工厂,但是要消耗他更多的资源.

5.什么是协程?

协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源).为啥说它是一个执行单元,因为它自带CPU上下文.这样只要在合适的时机,我们可以把一个协程切换到另一个协程. 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的.

即就是它临时保存了当前函数的一些信息,然后去执行另一个函数,等有时间了回头再来进行这个函数,只要切换的够快,那么就是多任务了.

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单.操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作.所以线程的切换非常耗性能.但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住.

实现协程的方法有很多,可以通过yield,greenlet,gevent.

6.三程对比

有一个列子,讲得非常的好:

有一个老板想要开个工厂进行生产某件商品(例如剪子)

他需要花一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的 为了能够生产剪子而准备的资源称之为:进程

只有生产线是不能够进行生产的,所以老板的找个工人来进行生产,这个工人能够利用这些材料最终一步步的将剪子做出来,这个来做事情的工人称之为:线程

这个老板为了提高生产率,想到3种办法:

  1. 在这条生产线上多招些工人,一起来做剪子,这样效率是成倍増长,即单进程 多线程方式
  2. 老板发现这条生产线上的工人不是越多越好,因为一条生产线的资源以及材料毕竟有限,所以老板又花了些财力物力购置了另外一条生产线,然后再招些工人这样效率又再一步提高了,即多进程 多线程方式
  3. 老板发现,现在已经有了很多条生产线,并且每条生产线上已经有很多工人了(即程序是多进程的,每个进程中又有多个线程),为了再次提高效率,老板想了个损招,规定:如果某个员工在上班时临时没事或者再等待某些条件(比如等待另一个工人生产完谋道工序 之后他才能再次工作) ,那么这个员工就利用这个时间去做其它的事情,那么也就是说:如果一个线程等待某些条件,可以充分利用这个时间去做其它事情,其实这就是:协程方式

7.总结

  1. 线程就是每一个工人,操作系统分配的单位
  2. 进程是操作系统资源分配的单位
  3. 协程,就是在线程里面,把空余的时间利用起来
  4. 线程和进程可能是并行,但是协程一定是并发的
  5. 进程消耗资源最大,效率最低.线程消耗资源一般,效率一般,协程消耗资源最低,效率最高
  6. 进程适合做多任务大型的运算,线程协程适合做多件小事情
  7. 线程依赖于进程,协程依赖于线程

你可能感兴趣的:(python,python,多线程,多进程)