我想知道是否有人知道任何神奇的函数,可以告诉我正在运行的函数是被同步调用还是异步调用。长话短说,我想做以下事情:
def fsync():
was_called_async() # >>> False
async fasync():
was_called_async() # >>> True
fsync()
await fasync()
这听起来可能有点奇怪,我同意。原因是因为我试图实现一个类似于functools.singledispatchmethod
的函数,但用于sync和async方法。这需要使用一个装饰器,因此需要“等待-内省”。我当前的工作方法here按预期工作:
from toolbox.cofunc import cofunc
import asyncio
import time
@cofunc
def hello():
time.sleep(0.01)
return "hello sync world!"
@hello.register
async def _():
await asyncio.sleep(0.01)
return "hello async world!"
async def main():
print(hello()) # >>> "hello sync world!"
print(await hello()) # >>> "hello async world!"
asyncio.run(main())
然而,它利用了inspect
模块,并不是我想要依赖的东西(获取前一帧并搜索await
)。如果有人知道一个替代方案,那将是可爱的。
2条答案
按热度按时间bqujaahr1#
只是没有一个好的方法来做你想做的事。
函数被“同步调用”和“异步调用”之间没有实际的区别,无论哪种方式,函数都只是被调用。
最接近差异的是调用者对返回值的处理,但即使查找
await
也不是一个好主意,因为或
将直观地被认为是“异步的”。
到目前为止,最可靠的选择是只有两个功能。
smtd7mpg2#
我认为您可以使用
asyncio.get_running_loop()
来确定函数是否在异步上下文中调用,因为函数在异步执行期间返回正在运行的循环,如果循环没有运行,则引发RuntimeError。控制台输出: