1 协程的定义
微线程,是是一个比线程还小的执行单元
称作执行单元的原因:协程是自带cpu上下文的
2 协程与线程的区别
线程:系统进行调度的基本单位
线程切换的过程中,从系统的角度来讲,不只是CPU的上下文(CPU寄存器和程序计数器)切换,系统为了程序能够高效执行,每一个线程都有自己缓存起来的数据,操作系统除了cpu上下文切换,还要恢复这些缓存数据,线程切换十分的消耗资源。
协程:开发者来确定,什么时候切换,切换多少次,协程之间的切换,只是cpu上下文的切换(一分钟切换上百万次)
3 协程的缺点
系统不能感知协程,所以系统不会直接做协程切换
协程不能够CPU多核特点,多进程+多协程
4 总结
就性能消耗
协程 < 线程 < 进程
5 greenlet(半自动)
pip install greenlet
import greenlet
import time
def func1():
while True:
print('--当前执行的是func1操作--')
g2.switch() # 手动切换
time.sleep(1)
def func2():
while True:
print('--当前执行的是func2操作--')
g1.switch()# 手动切换
time.sleep(1)
g1 = greenlet.greenlet(func1)
g2 = greenlet.greenlet(func2)
# 启动协程
g1.switch()
6 gevent(全自动)
import gevent
def func(num):
for i in range(num):
print('当前的协程是',gevent.getcurrent(),'变量是',i)
gevent.sleep(1) # 模拟的是耗时操作
if __name__ == '__main__':
g1 = gevent.spawn(func,3)
g2 = gevent.spawn(func,5)
g1.join()
g2.join()
import gevent
import time
from gevent import monkey
monkey.patch_all()
def func(num):
for i in range(num):
print('当前的协程是',gevent.getcurrent(),'变量是',i)
# gevent.sleep(1) # 模拟的是耗时操作
time.sleep(1)
if __name__ == '__main__':
g1 = gevent.spawn(func,3)
g2 = gevent.spawn(func,5)
g1.join()
g2.join()
注意点:
在实际的工作过程中,存在的大量的IO操作,但是需要gevent自己去实现io操作切换协程,所以打补丁
from gevent import monkey
monkey.patch_all()