自学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. 线程依赖于进程,协程依赖于线程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值