gpt4 book ai didi

python - 将代码同步到异步,无需重写函数

转载 作者:太空狗 更新时间:2023-10-30 01:31:29 26 4
gpt4 key购买 nike

基本上我有类似这样的同步代码:

def f(.):
...
def call(.):
..Some sync code..
try:
resp = f(..)
...some more transformations of resp...
return ..
except:
..Some error handling..

async def af(.):
...

基本上我想动态更改call 的代码,以便它可以调用和等待af 函数而不是f。有没有解决的办法?我在 github 上找到了 syncit,但它似乎不是我的解决方案,因为您必须先将代码重写为异步,然后再将其降级为同步。任何帮助将不胜感激。

最佳答案

asyncio 世界中,每个协程都可以在其他协程中执行(使用 await)或通过事件循环阻塞调用(使用 run_until_complete()).

您不能在常规函数内等待协程,因为该函数的调用会阻塞,而要等待的协程需要阻​​塞事件循环执行。这就是 asyncio 设计的工作方式。

如果您认为您的call() 函数被阻塞并且可以访问f() 实现,您可以在f() 中执行协程 运行事件循环:

async def af(.):
...

def f(.):
loop = asyncio.get_event_loop()
return loop.run_until_complete(af())

def call(.):
..Some sync code..
try:
resp = f(..)
...some more transformations of resp...
return ..
except:
..Some error handling..

如果您无权访问 f() 实现,我认为您无法更改 call() 以等待协程(没有一些丑陋的猴子补丁)。

我认为将 call() 重写为异步是唯一好的选择。

关于python - 将代码同步到异步,无需重写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com