python协程理论理解

1、概念

进程是指一段程序指令的运行活动,是计算机分配资源的最小单元(进程为线程提供资源,可以认为是指开了一块内存区域)

线程是计算机中可以被cpu调度的最小单元,一个进程中可以有多个线程,进程为进程中的线程提供资源,线程是真正工作的单位

协程也可以被称为微线程,是一种上下文切换技术,其实就是通过代码,切换执行不同的程序,目的是同线程一样,使计算机资源被充分利用

2、作用

进程: 如果开启多进程,任务就可以由原来的串行,变成并行任务,可以充分利用cpu多核优势,大大地提供,程序地运行效率。

线程:如果任务是I/O密集型任务,CPU经常处于空闲等待状态,浪费计算资源,如果开启多线程时,系统会自动识别CPU的状态,如果遇到空闲,会自动切换到其他线程去执行任务,大大提供程序的执行效率

协程:如果任务是I/O密集型任务,CPU经常处于空闲等待状态,浪费计算资源,所以我们可以在 在程序中定义如果遇到I/O密集性任务,就切换到另一个任务中去,这样反复循环,因为一个进程中一般只占用一个cpu,所以其实跟线程是类似的效果,区别就是一个要不断创建 新线程,一个不需要,直接在一个线程中进行切换任务即可

3、GIL锁

3.1、GIL锁 全称为Globa Interpreter Lock
GIL锁,是CPython解释器(我们平常用的一般都是Cpython)一种特殊机制,作用是在一个进程中,在一个时刻,只允许一个线程被CPU调用

如下图,一个进程霸占一个CPU,一个进程中可以有多个线程,分为主线程和子线程,子线程由主线程创建,因为GIL锁,主线程和各个子线程,在同一时刻只能有一个被CPU调用
python协程理论理解_第1张图片

如果我们想利用多核优势,让CPU同时处理任务,适合用多进程开发(即使资源开销很大)

计算密集型,用多进程 ,因为主要是CPU在工作 例如:大量的数据计算

如果程序不利用计算机多核优势,适合用多线程开发

IO密集型,用多线程,例如:文件读写,网络数据传输

Tips:通常我们在创建进程时,可以根据CPU逻辑核的个数,去创建进程,一个进程,占用一个cpu逻辑核。线程的个数创建,需要视具体情况而定

4、理解

上面的概念,自己初步看起来好像懂了,其实不懂,
之前自己是理解了,有多少个cpu,就开多少个进程,因为通常一个进程霸占一个cpu,但是还是没有理解线程和协程技术,总是不知道,总是模糊的,好像理解不了。一个进程里开多少个线程是自己决定的,一个线程里开多少给协程也是自己决定的,开多少个其实就是一个性能和业务的考量,其实多线程和多个协程说白了,就是网络I/O的并发,因为python的GIL锁的原因,所以python在一个进程中只能用一个cpu,所以说白了,为什么要用线程和协程,拿协程举例。如果我的序列化代码中,有多个字段要调用数据库,如果不用协程,那么我只能等一个字段调用数据库完成后,再进行下一个字段,这样大部分耗时都是在网络I/O上,效率大大降低,但是我用协程后,协程之间处理耗时的操作就会来回切换,A遇到耗时,A处理,但是程序不等,切换到B处理等等,这样大大提高效率。

5、协程技术

协程是利用I/O多路复用技术 和 yield技术来实现的

I/O多路复用
这是性能的关键。但我们这里只解释概念,其实现细节不是重点,这对我们理解python的协程已经足够了,如已足够了解,前进到0x02。

首先,你要知道所有的网络服务程序都是一个巨大的死循环,你的业务逻辑都在这个循环的某个时刻被调用:

def handler(request):
    # 处理请求
    pass

# 你的 handler 运行在 while 循环中
while True:
    # 获取一个新请求
    request = accept()
    

你可能感兴趣的:(python,python)