python协程和yeild

python多线程其实在操作系统级别是进程,因为在执行时,默认加了一个全局解释器锁(GIL),python的多线程,本质还是串行的,无法利用多核的优势;在java和C# 中,多线程是并发的,可以充分利用多核优势,但是线程切换是有调度器控制的;也会带来其他一些麻烦,线程共享的不可控性带来的安全问题,通过加锁来解决,又会导致对性能产生影响。

协程:

#!/usr/bin/env python
# encoding: utf-8
"""
@author: 侠之大者kamil
@file: 生消模型.py
@time: 2016/3/30 8:59
"""
def consumer():
    n = 0
    print ("消费者到位")
    while True:
        n = yield n
        if not n:
            return
        n -= 2
        print("消费2,还剩下%d" %n)

def produce(c):
    n = 0
    next(c)
    while n < 7:
        n += 3
        print("生产了3个,总共还有 %d" %n)
        n = c.send(n)
        print(">>还剩余: %d" %n)
    c.close
c = consumer()
produce(c)

结果:

C:Python34python.exe D:/kamil/Documents/py/Day9/生消模型.py
消费者到位
生产了3个,总共还有 3
消费2,还剩下1
>>还剩余: 1
生产了3个,总共还有 4
消费2,还剩下2
>>还剩余: 2
生产了3个,总共还有 5
消费2,还剩下3
>>还剩余: 3
生产了3个,总共还有 6
消费2,还剩下4
>>还剩余: 4
生产了3个,总共还有 7
消费2,还剩下5
>>还剩余: 5
生产了3个,总共还有 8
消费2,还剩下6
>>还剩余: 6
生产了3个,总共还有 9
消费2,还剩下7
>>还剩余: 7

Process finished with exit code 0
公众号请关注:侠之大者
原文地址:https://www.cnblogs.com/kamil/p/5336719.html