就是实现多任务,在同一时间,可以同时做多件事情,就比如你在电脑上可以同时上qq,同时听音乐~
虽然说,你可以在电脑上同时上qq和同时听音乐,看似你电脑正在完成多任务,但是实际上,你的电脑还是按顺序的一个一个执行任务的,让你感觉到多任务是错觉,因为电脑的运行速度实在是太快啦!
如果说要真正的多任务,一个cup完成一个任务,两个cup完成两个任务,多核cpu完成多个任务,好像只要你的cpu够多,就可以完成多任务了?
不是的,你可以打开你的任务管理器,看看你电脑的后台有多个进程在运行吧!现在的电脑大多都是双核或者四核的吧,至少我家电脑现在还是双核T.T,所以,下面就要引出并发和并行的概念了!
所以多,基本上都是处于并发状态下的运行方式.
为了实现线程,我们可以使用threading模块(使用方法也简单,这里我就不说了),需要注意的是,线程的全局变量共享的,我们可以理解成一条生产线,a负责放东西,b负责装东西等等...总的东西是共享的,但是你们都同时在做一件事情!.
线程中,有一个加 互斥锁 的概念,就是多个线程,都同时需要对一个全局变量进行修改的时候,如果没有先后顺序的话,不同的操作系统可能就会有不同的结果,所有就有了互斥锁.
# 创建锁
mutex = threading.Lock()
# 锁定
mutex.acquire()
# 释放
mutex.release()
即a负责放东西,b负责装东西,加了锁之后,必须等a完成之后,b才能继续装东西,后面以此类推,这样就保证了一整个过程不会混乱了.
但是这样,就会产生一个新的东西,叫死锁,就是在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。即,你在等他先,他在等你先,你们就僵住了.
进程,大家看到都见过,当我们一个程序未响应卡住的时候,我们就会打开任务管理器,然后结束这个进程,那么进程到底是什么呢?
进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。所以不仅可以通过线程完成多任务,进程也是可以的.
进程的创建可以使用multiprocessing,使用起来也比较简单,我们需要知道的是,进程的多任务创建,相当于,复制了一个完全一模一样占了相同资源的程序,一起运行,并且他们是不共享全局变量的,如果需要传递变量,可以使用queue方法进行传递.
我们可以理解成,一个工厂为提高效率,他又多开了一个工厂,但是要消耗他更多的资源.
协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源).为啥说它是一个执行单元,因为它自带CPU上下文.这样只要在合适的时机,我们可以把一个协程切换到另一个协程. 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的.
即就是它临时保存了当前函数的一些信息,然后去执行另一个函数,等有时间了回头再来进行这个函数,只要切换的够快,那么就是多任务了.
在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单.操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作.所以线程的切换非常耗性能.但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住.
实现协程的方法有很多,可以通过yield,greenlet,gevent.
有一个列子,讲得非常的好:
有一个老板想要开个工厂进行生产某件商品(例如剪子)
他需要花一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的 为了能够生产剪子而准备的资源称之为:进程
只有生产线是不能够进行生产的,所以老板的找个工人来进行生产,这个工人能够利用这些材料最终一步步的将剪子做出来,这个来做事情的工人称之为:线程
这个老板为了提高生产率,想到3种办法: