【发布时间】:2019-08-26 22:13:21
【问题描述】:
我有一个如下所示的非异步函数:
def do_stuff(on_finished):
result = # complicated calculations here
on_finished(result)
我传入的回调或多或少是这样的:
async def on_finished(self, result):
response = await post_over_http(result)
self.last_status = response.status
当我打电话给do_stuff 时,我想要发生的事情是这样的:
-
do_stuff执行并调用on_finished -
on_finished执行,通过 HTTP 发布结果,然后立即返回。 -
do_stuff现在立即返回。 - 稍后,HTTP 响应返回,执行返回到
on_finished的第二行。
重要的是,我不希望 do_stuff 是异步的。出于架构原因,我希望 do_stuff 与网络代码的异步特性隔离,所以我不想仅仅因为使用它的某些代码是异步的而使其异步。
在 JavaScript 中这没有问题 - 基本上将上面的代码直接转录为 JavaScript,我将获得所需的行为。 onFinished 将返回一个 Promise,doStuff 不会等待并立即返回,但是当 Promise 稍后解析时,onFinished 的第二行运行。这在 Python 中可能吗?我不确定如何实现它。使用上面的代码,我想我只是在do_stuff 的最后一行创建了一个协程,但从不调用它。
【问题讨论】:
-
协程需要一个事件循环。如果您需要它作为“与异步性质隔离” - 尝试另一种并行方法
-
鉴于你的拱门。约束,在 main 中集成事件循环的创建和启动可能并不容易
标签: python python-asyncio