【问题标题】:How to simplify python coroutines?如何简化python协程?
【发布时间】:2020-12-06 04:30:37
【问题描述】:

我真的很想使用 python 协程来简化我的数据消费者,但我发现标准实现不是很优雅:

def printer():
    print('setup')

    try:
        while True:
            data = yield
            print(data)

    except GeneratorExit:
        pass

    print('cleanup')

有没有办法使用 for 循环来编写消费者?

def printer():
    print('setup')

    for data in yield_iterator():
        print(data)

    print('cleanup')

我尝试了一些不同的方法来封装yieldGeneratorExit 的处理,但是一旦我将yield 移动到子函数printer() 就不再被识别为协程。

你知道用python编写协程的优雅方法吗?

【问题讨论】:

    标签: python-3.x coroutine synchronous


    【解决方案1】:

    我终于能够根据plamut 的答案构建解决方案: https://stackoverflow.com/a/60118660/11462250

    关键是在await

    中创建一个yields的等待对象
    class Awaitable:
        def __await__(self):
            return (yield)
    

    那么就可以这样写:

    async def printer(source):
        print('setup')
    
        async for data in source:
            print(data)
    
        print('cleanup')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2017-07-26
      • 2020-08-28
      • 1970-01-01
      相关资源
      最近更新 更多