协程(coroutine)
也叫:微线程,是一种用户态的轻量级线程,就是在单线程下实现并发的效果。
优点:
1:无需线程上下文切换的开销。(就是函数之间来回切换)
2:无需原子操作锁定及同步的开销。(如改一个变量就相当于一个原子操作,因为协程是在单线程内操作,属于串行,所以不需要锁的操作)
3:方便切换控制流,简化编程模型。
4:高并发+高扩展+低成本:一个CPU支持上万个协程都不是问题,所以很适合用于高并发处理。(因为它都在一个线程里处理)
缺点:
1:无法利用多核资源,协程的本质是个单线程,它不能同时将单个CPU上的多个核用上,协程需要和进程配合才能运行在多CPU上,一般用于CPU密集型
2:进行阻塞操作会阻塞掉整个程序
gevent (实现自动切换):是一个第三方库,可以通过gevent实现并发同步或异步编程,其中的主要模式是Greenlet,
greenlet (实现手动切换)由gevent进行了封装
举例:通过手动切换实现协程
1 import gevent 2 def fun1(): 3 print('输出函数1') 4 gevent.sleep(2) 5 print('函数1结束') 6 def fun2(): 7 print('输出函数2') 8 gevent.sleep(1) 9 print('函数2结束') 10 def fun3(): 11 print('输出函数3') 12 gevent.sleep(0) 13 print('函数3结束') 14 gevent.joinall([gevent.spawn(fun1),gevent.spawn(fun2),gevent.spawn(fun3)])生成3个函数的自动切换