协程

tech2022-07-11  174

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()
最新回复(0)