美文网首页
生成器到协程

生成器到协程

作者: 低吟浅唱1990 | 来源:发表于2019-03-06 22:42 被阅读0次
    def simple_coroutine():
        print('->coroutine started')
        x = yield
        print('-> coroutine received:',x*2)
    >>>my_coro = simple_coroutine()
    >>>my_coro
    >>><generator object simple_coroutine at 0x000000000068A2B0>
    >>>next(my_coro)
    ->coroutine started
    >>>my_coro.send(42)
    -> coroutine received: 84
    程序会在yield处挂起,产出None值 因为yield关键字右边没有表达式
    
    from inspect import getgeneratorstate  #执行过程中的状态显示
    def simple_coro2(a):
        print('-> Started:a=',a)
        b = yield a
        print('-> Received: b = ',b)
        c = yield a + b
        print('-> Received: c = ',c)
    my_coro2 = simple_coro2(14)
    getgeneratorstate(my_coro2)
    next(my_coro2)
    getgeneratorstate(my_coro2)
    my_coro2.send(28)
    my_coro2.send(99)
    -> Started:a= 14
    -> Received: b =  28
    -> Received: c =  99
    协程在yield关键字所在的位置暂停执行。在赋值语句中, = 右边的代码在赋值之前执行。因此,对于 b = yield a 这行代码来说。等到客户端再激活协程时才会设定b的值。
    
    image.png
    def averager():
        total = 0.0 
        count = 0
        averager = None
        while True:
            term = yield averager #yield 表达式用于暂停执行协程, 把结果发给调用方; 还用于接收调用方后面发给协程的值, 恢复无限循环。
            total += term
            count += 1
            averager = total/count
    >>>coro_avg = averager()  #创建协程
    >>>next(coro_avg)    # 调用next 预激协程
    >>>print(coro_avg.send(18))  # 计算平均值
    >>>18
    >>>print(coro_avg.send(30))
    >>>24
    >>>coro_avg.close()  #停止
    

    协程预激

    相关文章

      网友评论

          本文标题:生成器到协程

          本文链接:https://www.haomeiwen.com/subject/oltguqtx.html