为啥这个程序不异步运行?

Posted

技术标签:

【中文标题】为啥这个程序不异步运行?【英文标题】:Why does this program not run asynchronously?为什么这个程序不异步运行? 【发布时间】:2021-05-19 17:54:08 【问题描述】:

我有想要异步运行的代码。我希望输出是以下之一:

Getting forecast 1
Getting forecast 2
Forecast 2 retrieved
Forecast 1 retrieved

或者

Getting forecast 1
Getting forecast 2
Forecast 1 retrieved
Forecast 2 retrieved

但是,它似乎是同步运行的,因为每次我运行它都会得到

Getting forecast 1
Getting forecast 2
Forecast 1 retrieved
Forecast 2 retrieved

代码附在下面:

import asyncio
import random
import pandas as pd
import numpy as np

async def get_forecast1():
    print('Getting forecast 1')
    await asyncio.sleep(random.randint(0 , 10))
    return pd.DataFrame(np.zeros((2,2)))

async def retrieve_forecast1():

    forecast1 = await get_forecast1()
    print('Forecast 1 retrieved')
    return forecast1

async def get_forecast2():
    await asyncio.sleep(random.randint(0 , 10))
    return pd.DataFrame(np.zeros((3,3)))

async def retrieve_forecast2():
    print('Getting forecast 2')
    forecast2 = await get_forecast2()
    print('Forecast 2 retrieved')
    return forecast2

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.gather(retrieve_forecast1(), retrieve_forecast2()))

【问题讨论】:

【参考方案1】:

运行它时我似乎很不走运。我运行它大约 10 次并收到相同的输出,这让我相信它正在同步运行。再运行几次后,我终于收到了第二个输出。

【讨论】:

您可以通过更改睡眠持续时间来测试这一点,这样get_forecast1() 的睡眠时间总是比get_forecast2() 长。

以上是关于为啥这个程序不异步运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个异步程序不交错输出?

为啥这个异步函数无限循环?

为啥我的异步写入函数不运行?

为啥我不能将异步代码作为同步运行 [重复]

为啥在异步事件循环运行时我无法捕获 SIGINT?

为啥异步等待操作仍然很耗时