【发布时间】:2022-04-22 05:43:54
【问题描述】:
我所有的代码都是在没有考虑异步的情况下编写的;但是,我使用异步的 one 函数(由另一位开发人员编写;就我而言,它是一个黑匣子)。我们称之为func_1。我需要在另一个函数中调用这个函数,调用它func_2(它本身可以在任意长的函数链中调用func_3、func_4 等......)。
由于func_1 是异步的,我需要等待它,但由于我在func_2 中调用它,我还需要使func_2 异步(我不能在非异步函数中等待)。这继续下去;我需要将整个函数链func_2、func_3、func_4 转换为异步函数。
有没有办法避免这种情况?我只想打电话给func_1,等待它完成,然后在我正常的python代码的其余部分使用结果。我可以在 func_1 周围创建一个包装器来允许这样做吗?
我想要的基本上是以下内容,这是行不通的:
# This is the function defined by someone else
async def func_1(*args):
return something(*args)
# This is my wrapper
def func_1_wrapper(*args):
return await func_1(*args)
# So that I can call it like normal within the rest of my code
def func_2(*args):
# do something
a = func_1_wrapper(*args)
# do something else
【问题讨论】:
-
您可以在
func_1_wrapper中执行func_1并使用asyncio.run等待它完成:asyncio.run(func_1()) -
如果你关心它是异步的,因为它允许(伪)并行代码执行,那么是的,你需要把
await和async一直做向上。如果没有,您可以使用func_1阻止所有内容直到完成,只需asyncio.run(func_1())。 -
在旧版本中你会使用
asyncio.get_event_loop().run_until_complete(func_1())。 -
@deceze 我之前试过,但我得到了
RuntimeError: This event loop is already running。它仅在函数内部运行时才有效吗? 更新:当我直接在 jupyter notebook 中运行它时确实会弹出错误,但当我在函数中运行它时不会。现在就试试,谢谢你的帮助。 -
对那些遇到我的问题的人的权利:RuntimeError 发生是因为 Ipython 运行自己的事件循环。要绕过它,您还需要
import nest_asyncio并运行nest_asyncio.apply()beforeasyncio.get_event_loop().run_until_complete(func_1(..))。见:github.com/microsoft/playwright-python/issues/178
标签: python async-await python-asyncio