yield让协程暂停,和线程的阻塞是有本质区别的

#coding=utf-8
import time

def consumer():
    r = ''
    while True:
        print "before yield"
        n = yield r
        print n
        if not n:
            print n
            # return
        print('[consumer] Consuming %s...'%n)
        time.sleep(1)
        r = "200k"
def produce(c):
    c.next()
    n = 0
    while n < 5:
        n = n + 1
        print("before")
        r = c.send(n)
        print("after",r)
    c.close()
if __name__ == "__main__":
    c = consumer()
    produce(c)

yield让协程暂停,和线程的阻塞是有本质区别的

代码中创建了一个叫做consumer的协程,并且在主线程中生产数据,协程中消费数据。

其中 yield 是python当中的语法。当协程执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。

但是,yield让协程暂停,和线程的阻塞是有本质区别的。协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。

因此,协程的开销远远小于线程的开销。

出处:https://blog.****.net/WJWFighting/article/details/82589177

https://www.sohu.com/a/237171690_465221