协程(coroutine)工作原理

原文地址-廖雪峰

协程(Coroutine)在执行过程中可中断去执行其他任务,执行完毕后再回来继续原先的操作。可以理解为两个或多个程序协同工作

协程特点在于单线程执行。
优势一:具有极高的执行效率,因为在任务切换的时候是程序之间的切换(由程序自身控制)而不是线程间的切换,所以没有线程切换导致的额外开销(时间浪费),线程越多,携程性能优势越明显。

优势二:由于是单线程工作,没有多线程需要考虑的同时写变量冲突,所以不需要多线程的锁机制,故执行效率比多线程更高。

常利用多进程(利用多核)+协程来获取更高的性能。

讲工作原理前先了解yield,它不仅可以返回一个值,还可以接收调用者发出的参数。

代码如下:

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'

def produce(c):
    c.send(None)
    n = 0
    while n < 5:
        n = n + 1
        print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)
        print('[PRODUCER] Consumer return: %s' % r)
    c.close()

c = consumer()
produce(c)

运行结果:

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK

整个代码关键点在于n = yield rr = c.send(n)这两处。

每次运行到r = c.send(n)的时候,先执行=右边部分:将n通过send()传入consumer()中,即n=send(n),继续往下执行到将200 ok赋给r再一次运行到n = yield r的时候,yield会返回r;接着又切换到了produce()函数,返回的r被赋给了r。这就是整个的运行过程。

总结:
可以把n = yield r理解为一个接收机,可以接受外部通过send()传进来的值。每次运行到这里,会先执行yield r返回r,再把返回值赋给n。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原创文章出自公众号:「码农富哥」,如需转载请请注明出处!文章如果对你有收获,可以收藏转发,这会给我一个大大鼓励哟!...
    大富帅阅读 10,105评论 3 21
  • Coroutine in Python 引言: 本文出自David Beazley 的关于协程的PPT,现在笔者将...
    LumiaXu阅读 1,655评论 4 8
  • 原文链接:https://github.com/EasyKotlin 在常用的并发模型中,多进程、多线程、分布式是...
    JackChen1024阅读 10,793评论 3 23
  • 感恩时光12.9 1.感恩宇宙恩典,今天一早起来,给先生和女儿煮了妈妈做的抄手,感恩妈妈的爱心❤抄手,给我们方便的...
    洋姐书香阁阅读 230评论 1 0
  • 凡施于人的,都会回向给你自己。凡你对别人所做的,就是对自己做。这是历来最伟大的教诲。不管你对别人做了什么,那个真正...
    树德莫如滋阅读 170评论 0 0