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)
代码中创建了一个叫做consumer的协程,并且在主线程中生产数据,协程中消费数据。
其中 yield 是python当中的语法。当协程执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。
但是,yield让协程暂停,和线程的阻塞是有本质区别的。协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。
因此,协程的开销远远小于线程的开销。
出处:https://blog.****.net/WJWFighting/article/details/82589177