【问题标题】:Question about async and await in python codepython代码中关于async和await的问题
【发布时间】:2024-03-09 00:10:01
【问题描述】:

我不确定如何使用 aync/await。假设我有这个功能:

async def test():
   result = get_db_data() # to get records from db
   return result

所以,这里的 get_data 不是一个异步函数,我调用 test() 我使用 await test()。但我的问题是代码被认为是异步的,还是我也应该让 get_data 和 async func 并用 await 调用它?

我需要帮助

注意:我尝试在测试函数中添加 await asyncio.sleep(30) 并且我同时测试了 2 个请求,所以它似乎正在工作,因为它在 30 秒后返回了两个结果(所以它没有不需要 60 秒)

【问题讨论】:

    标签: python asynchronous async-await


    【解决方案1】:

    背景

    这里有一个小例子,希望能帮助你理解。说这里是你的功能

    async def test():
        # does something
    

    现在,我们为什么要让它异步?比如说,我们必须在另一个线程方法中使用它。

    async def threaded_f():
                result = await test()
                # Some random code to get variable Y
                Y = Y + result
    

    现在,使 test() 异步的优点是,在 result = test() 行,线程将等待 test() 的结果,因为它的返回值将在稍后的代码中使用。如果它是 void 类型的函数,我们可能不会等待调用并让线程函数继续执行。

    回答

    所以,回答你的问题。是的,您可以使 get_db_data() 异步并等待,因为它与 threaded_f 函数中讨论的情况相同。结果需要存储在变量中。

    【讨论】:

      【解决方案2】:

      在回答您的问题时,get_db_data 不会仅仅因为它位于异步测试协程内而被视为异步。

      您需要了解事件循环协程才能很好地回答您的问题。

      如果您的同步例程没有阻塞,那么您可以摆脱它,但您需要彻底了解它在做什么,以确保它不会导致意外延迟。如果您不希望您的程序被 get_db_data 阻塞,那么您需要使其可等待,例如协程。

      asyncio docs

      【讨论】: