python numpy支持asyncio吗

问题描述 投票:0回答:1

我需要将包含 numpy 方法的同步代码移至异步代码。我试图找到它的文档但一无所获。

我正在使用的方法是:

array
datetime64
where

当我将“await”添加到这些方法中时,该过程是否会继续并且不会被卡住?

我查看了一些与之相关的问题,但我不确定是否有相关/更新。

带有异步共享 numpy 数组的 python 多处理:池与队列

np.unique 使用 asyncio.to_thread 阻塞 CPU

python numpy async-await python-asyncio
1个回答
0
投票

我同意@freakish 您应该阅读:

异步代码背后的想法是暂停执行并等待来自外部源(例如文件、数据库、网络)的结果。这种方法有利于您的代码并减少生成多个结果所需的时间,因为 CPU 在等待时通常会停止并且不执行任何操作。如果您需要来自网络的资源,您的代码将一次请求一个资源,即使 CPU 不受这些请求的影响。通过异步请求(函数),您可以同时请求所有资源,从而允许 CPU 同时执行其他任务。

Numpy 不支持异步任务。但即使是这样,还有意义吗?我想不是。 Numpy 执行 CPU 密集型任务,因此没有任何优势。如果您使用 Numpy 方法作为异步函数,CPU 仍将用于计算结果。程序将在该方法处被阻塞,直到它完成,然后再转到下一个方法。

如果出于任何其他原因你需要它,正如 @freakish 和 @Leah 所说,你需要使你使用的每个 numpy 函数都异步。包装纸可以帮助你。像这样的东西:


import functools
import asyncio
from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor()

def async_decorator(func):
    @functools.wraps(func)
    async def async_wrapper(*args, **kwargs):
        loop = asyncio.get_event_loop()
        return await loop.run_in_executor(executor, functools.partial(func, *args, **kwargs))
    
    return async_wrapper

@async_decorator
def async_function1(x, y)
    return function1(x, y)

@async_decorator
def async_function2()
    return function2()

但是这段代码不会加快你的操作速度。

考虑使用 多处理模块ProcessPoolExecutor

© www.soinside.com 2019 - 2024. All rights reserved.