python 协程
协程
一般的子程序都是层级调用,比如A调用B,B调用C,C执行完毕返回,B执行完毕返回,最后A执行完毕返回。一个子程序的调用永远都是只有一个入口跟一个出口。调用顺序是明确的
而协程跟子程序不同,协程的执行过程中可以进行中断,转而去执行别的程序,然后再转回来继续运行中断的程序。这个跟子程序的调用不一样,类似于CPU的中断。例如一条流水线,一般是先生产a,然后生产b,最后才生产c,协程的执行结果可能是a生产到一半,中断,然后去生产c,然后c生产到一半,专区生产b。
def A():
print '1'
print '2'
print '3'
def B():
print 'x'
print 'y'
print 'z'
如果有协程执行这两个函数的话,结果可能如下
1
x
y
2
z
3
但是在这两个函数执行的时候,这两个函数之间并没有调用的关系。
看起来比较像多线程,但是跟多线程不同的是,协程是在一个线程中运行的。也就是说程序之间的切换不是线程的切换吗,而是有程序本身进行控制的。避免了线程切换时候的开销,跟多线程比起来,线程的数量越多的情况下,线程间的切换开销越大,因此协程的优势越大。另外由于是在一个线程中运行的,因此就不需要存在锁,因为只有一个线程就不会出现读写变量的冲突,对资源的控制只需要判断状态就行。
能够有效提高并发的情况可以是多进程加协程,这样不仅效率高,而且性能也会比较好。