【问题标题】:How to run an async function inside a regular function? [duplicate]如何在常规函数中运行异步函数? [复制]
【发布时间】:2022-01-03 22:30:13
【问题描述】:

这是我正在制作的不和谐机器人,使用 discord.py API,其中基本上所有事情都在这些异步函数中完成。

假设我有一个如下所示的异步方法:

async def async_function():
    await something()

还有一个我想运行异步函数的常规方法:

def regular():
   if condition:
      async_function()

我可以在常规方法中运行异步方法吗?如果可以,如何?

【问题讨论】:

  • 您是否希望异步函数在后台运行?在大多数情况下,当人们提出这个问题时,他们对一旦设法调用异步函数会发生什么抱有不切实际的期望——但除非您编写其余代码来处理异步代码,否则它不会解决您的问题问题。否则:.run_until_complete(coroutine)

标签: python asynchronous


【解决方案1】:

你可以这样做:

import asyncio
def regular():
    if condition:
        asyncio.run(async_function())

装饰器方法。不知道是不是pythonic,但是如果你经常从同步函数中调用很多异步函数,你也可以做一个装饰器。你在你的异步函数上添加这个装饰器。然后你可以在你的同步函数中调用它,就像调用另一个同步函数一样。

def async_decorator(f):
    """Decorator to allow calling an async function like a sync function"""
    @wraps(f)
    def wrapper(*args, **kwargs):
        ret = asyncio.run(f(*args, **kwargs))

        return ret
    return wrapper

@async_decorator
async def async_function():
    await something()

def regular():
    if condition:
        async_function()

注意:您不能使用这种方法来嵌套异步函数,我的意思是在另一个异步函数中调用一个异步函数。

【讨论】:

  • 您的装饰器方法禁止使用 async_function 作为异步。不妨从函数定义中删除async
  • @Woodford 你说得对,异步函数将与其余代码同步运行,但允许使用 aiohttp 或其他包在其中执行异步请求等操作。
  • @GinoMempin 已更新。谢谢你的建议。
猜你喜欢
  • 2021-12-31
  • 2022-11-16
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多