异步 运行 具有输出的同一函数的多个实例

Asynchronously run several instances of the same function with output

我正在尝试在单个数据集上构建多个机器学习模型。然后,所有模型的输出将用于进一步的步骤。我希望同时进行模型训练以节省时间和体力劳动。

我对异步处理完全陌生,这在我下面的代码中表现出来,无法正常工作。我收到错误:

sys:1 RuntimeWarning: coroutine 'level1models' was never awaited

当不使用 await 时,这似乎是一个相当普遍的问题,但无论我在哪里放置此命令,错误仍然存​​在,而且我在网上找到的答案似乎没有解决 return 值。 为了提供可重现的示例,我更改了我的代码,同时保持与原始结构相同的结构。

from time import sleep

nrs_list = [1, 2, 3, 4, 5]


def subtract(n):
    return n - 1


async def subtract_nrs(nrs):
    # Train selected ML models
    numbers = {nr: subtract(nr) for nr in nrs}
    sleep(50)

    # Loop to check if all models are trained
    while True:
        print([i for i in numbers.values()])
        if [i for i in numbers.values()] != [None for _ in range(len(numbers))]:
            break
        sleep(5)
    return numbers

r = subtract_nrs(nrs_list)
print(r)
<coroutine object subtract_nrs at 0x000002A413A4C4C0>
sys:1: RuntimeWarning: coroutine 'subtract_nrs' was never awaited

任何时候你创建一个协同程序(这里是你调用 subtract_nrs)但不等待它,asyncio 将发出你收到的警告 [0]。避免这种情况的等待是通过等待协程,或者通过

await subtract_nrs(nrs_list)

或使用 asyncio.gather [1],它本身必须等待

await asyncio.gather(subtract_nrs(nrs_list)

请注意,这里使用 asyncio.gather 没有任何价值。只有当您需要同时等待多个协程时才会出现这种情况。

根据您的代码,您似乎使用 subtract_nrs 作为程序的入口点。 await 不能在 async def 之外使用,所以你需要另一种方式来等待它。为此,您通常需要使用 asyncio.run [2]。这将处理创建、运行、关闭事件循环以及等待协程。

asyncio.run(subtract_nrs(nrs_list))

既然我们已经介绍了所有这些内容,asyncio 实际上不会帮助您实现同时执行的目标。 asyncio 从不同时做事;它同时做事 [3]. While one task is waiting for I/O to complete, asyncio's event loop allows another to execute. While you've stated that this is a simplified version of your actual code, the code you've provided isn't I/O-bound; it's CPU-bound. This kind of code doesn't work well with asyncio. To use your CPU-bound code and achieve something more akin to simultaneous execution, you should use processes. not asyncio. The best way to do this is with ProcessPoolExecutor from concurrent.futures [4].