IOTXING

记录技术学习之路

0%

Python 协程

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

但是在这两个函数执行的时候,这两个函数之间并没有调用的关系。

看起来比较像多线程,但是跟多线程不同的是,协程是在一个线程中运行的。也就是说程序之间的切换不是线程的切换吗,而是有程序本身进行控制的。避免了线程切换时候的开销,跟多线程比起来,线程的数量越多的情况下,线程间的切换开销越大,因此协程的优势越大。另外由于是在一个线程中运行的,因此就不需要存在锁,因为只有一个线程就不会出现读写变量的冲突,对资源的控制只需要判断状态就行。

能够有效提高并发的情况可以是多进程加协程,这样不仅效率高,而且性能也会比较好。