知道函数内部是同步调用还是异步调用

时间:2020-12-29 02:51:09

标签: python asynchronous python-asyncio

我想知道是否有人知道任何可以告诉我正在运行的函数是同步调用还是异步调用的神奇函数。长话短说,我想做以下事情:

def fsync():
    was_called_async() # >>> False

async fasync():
    was_called_async() # >>> True

fsync()
await fasync()

这听起来可能有点奇怪,当然,我同意。原因是因为我试图实现一个类似于 functools.singledispatchmethod 的函数,但用于同步和异步方法。这需要使用装饰器,因此需要“等待自省”。我目前的工作方法 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)。如果有人知道一个很好的替代方案。

1 个答案:

答案 0 :(得分:2)

没有什么好方法可以做您正在寻找的事情。

函数被“同步调用”或“异步调用”之间没有实际区别。无论哪种方式,该函数都会被调用。

最接近差异的是调用者对返回值的处理,但即使寻找 await 也是一个坏主意,因为诸如

await asyncio.gather(yourfunc(), something_else())

asyncio.run(yourfunc())

直觉上会被认为是“异步”。

目前最可靠的选择是只有两个功能。