【问题标题】:Using @property decorator with @asyncio.coroutine without doing yield from possible?将@property 装饰器与@asyncio.coroutine 一起使用而不做yield from 可能?
【发布时间】:2015-10-10 10:54:06
【问题描述】:

我想要一个类似以下的课程

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.

这样的事情可能吗?

【问题讨论】:

  • 运行协程生成器的唯一方法是使用'yield from',调用协程可以有效地驱动它,否则使用asyncio.async之类的东西来驱动它。否则,根据您的观察,它只是一个“惰性”生成器对象。
  • @shongololo 也可以这样回答。

标签: python python-asyncio


【解决方案1】:

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

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

如果没有上述任何一项,根据您的观察,它只是一个 inert 生成器对象(或 Python 3.5 中的协程)。

【讨论】:

  • 谢谢。所以很明显,如果我不想从该属性中屈服,该属性就不能成为协程。您是否能够扩展您的答案以展示如何在普通函数(不是协程函数)中创建一个任务,该任务将在另一个线程中运行阻塞代码,以便主线程/循环可以继续?我将更新我的问题以反映这一点。编辑:实际上,我最好提出一个新的、更具体的问题。我认为这个问题已经得到解答。
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2016-03-14
  • 2020-05-25
  • 1970-01-01
  • 2019-11-24
相关资源
最近更新 更多