Python 协程Coroutine

协程 Coroutine

协程,又称微线程,纤程。

协程和函数的区别

子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。*“子程序就是协程的一种特例。”*

协程和多线程

和多线程比,协程有何优势?
最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

yield生成器

Python对协程的支持是通过generator实现的。在generator中,我们不但可以通过for循环来迭代,还可以不断调用next()函数获取由yield语句返回的下一个值,函数并没有跑完。

    def test():
        i = 0
        a = 4
        while i < a:
        x = yield i    # 并不是把i的值赋给x
        i += 1

    for i in test()
        print i      #输出结果是 0   1   2   3
    a = test()
    print a,a.next(),a.next(),a.next()

yield中的send()方法:给 x 赋值

    def test():
        x = yield '第一步,他会直接返回哟'
        print '哈哈,第一次哟%s'%x
        x = yield '%s,它每次请求,不管是send,还是next,都会往下一直跑到下一个yield,并且,把yield后面的值返回回来哟'%x
        print '哈哈,第二次哟%s'%x
        x = yield

    t = test()
    print t.next()
    print t.send('嘻嘻嘻,这样才是赋值给第一个x哟!')
    print t.send('这是给第二个赋值哟')
    print t.send('嘻嘻,试下')
    print t.send(5)      #会报错

特性:生产者,消费者的行为方式,无需立刻执行,需要时才执行,节省性能。

用协程解决斐波拉切数列问题

仔细理解下面的例子可以对协程有更深的理解:

    def fiber(num):
        x,y = 1,1
        while x < num:
            yield x
            x,y = y,x+y

    for i in fiber(99999):
        print i,

你可能感兴趣的:(python,python学习)