我需要将包含 numpy 方法的同步代码移至异步代码。我试图找到它的文档但一无所获。
我正在使用的方法是:
array
datetime64
where
当我将“await”添加到这些方法中时,该过程是否会继续并且不会被卡住?
我查看了一些与之相关的问题,但我不确定是否有相关/更新。
我同意@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