异步 运行 具有输出的同一函数的多个实例
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].
我正在尝试在单个数据集上构建多个机器学习模型。然后,所有模型的输出将用于进一步的步骤。我希望同时进行模型训练以节省时间和体力劳动。
我对异步处理完全陌生,这在我下面的代码中表现出来,无法正常工作。我收到错误:
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].