【发布时间】:2019-09-28 09:57:46
【问题描述】:
背景:我是一位经验丰富的 Python 程序员,对新的 coroutines/async/await 功能一无所知。我无法编写异步“hello world”来挽救我的生命。
我的问题是:我得到了一个任意的协程函数f。我想写一个协程函数g,它将包装f,即我将g 给用户,就好像它是f,用户会调用它并且不会更聪明,因为@987654327 @ 将在后台使用 f。就像你装饰一个普通的 Python 函数来添加功能一样。
我要添加的功能:每当程序流进入我的协程时,它都会获取我提供的上下文管理器,并且一旦程序流离开协程,它就会释放该上下文管理器。流量回来了?重新获取上下文管理器。会退吗?重新释放它。直到协程完全结束。
为了演示,这里描述了普通生成器的功能:
def generator_wrapper(_, *args, **kwargs):
gen = function(*args, **kwargs)
method, incoming = gen.send, None
while True:
with self:
outgoing = method(incoming)
try:
method, incoming = gen.send, (yield outgoing)
except Exception as e:
method, incoming = gen.throw, e
是否可以使用协程来做到这一点?
【问题讨论】:
-
您能否让您的示例可重现?
self和function是什么?你怎么称呼generator_wrapper,为什么它有_作为第一个参数? -
如果这令人困惑,您可以忽略该示例。上面的段落描述了我想要的功能。
-
要了解协程、异步、等待和事件循环,我强烈推荐观看 David Beazley 的 this lecture。讲师在现场观众面前从零开始创建了一个简单的事件循环,准确地展示了协程和事件循环之间的相互作用。 (不要被讲座使用较旧的
yield from语法而推迟,await只是yield from的一个非常薄的语法糖,正如宫城先生的回答中所解释的那样。)
标签: python async-await coroutine