协程,是一种用户态的线程
协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器的上下文和栈。
协程一定是在单线程里运行的,
yield函数就是一个协程
协程是由用户控制:在单线程里协程能实现并发操作,但是串行的
线程是CPU控制:硬件控制,单核CPU运行多个线程并发,实际上也是串行的
协程的效率比多线程切换高
协程的好处:
1.无需线程上下文切换开销
2.无需原子操作锁定及同步的开销
3.方便切换控制流,简化编程模型
4.高并发+高扩展+低成本:一个CPU支持上万的协程,很适合高并发处理
缺点:
1.无法利用多核资源:协程的本质是个单线程,不能将单个CPU的多个核用上,协程需要和进程配合才能运行在多CPU上,但绝大时间编程都没有必要,除非CPU密集型应用才有可能用到
2.进行阻塞(blocking)操作(如IO时)会阻塞整个程序 #多线程不影响
Gevent模块可以解决阻塞这个问题