使用@property decorator和@asyncio.coroutine而不做可能的收益?

时间:2015-07-21 05:58:09

标签: python python-asyncio

我想要一个类似于以下

的课程
Foo(object):
    @property
    @asyncio.coroutine
    def bar(self):
        # This will need to run some blocking code via loop.run_in_executor()
        return 'bar'

然后我想要访问属性而无需yield from

# In a loop...
foo = Foo()
foo.bar    #This will return a generator object, but I want it to return 'bar'.
yield from foo.bar     #This will return 'bar', but I don't want to do the yield from.

这样的事情可能吗?

1 个答案:

答案 0 :(得分:3)

运行协程生成器的方法是使用另一个协同程序中的yield from(在Python 3.5中为await)。 yield fromawait)允许一个协同程序驱动另一个协同程序,这通常意味着你有链接的协同程序链,最终由事件循环驱动。

另一种选择是使用像asyncio.async(Python 3.5中的ensure_future())之类的类似任务的包装来驱动协程。

如果没有上述内容之一,根据您的观察结果,它只是 inert 生成器对象(或Python 3.5中的协同程序)。