Мне нужно переместить код синхронизации, включая методы numpy, в асинхронный код. Я пытался найти документацию по нему, но ничего не нашел.
Я использую следующие методы:
array
datetime64
where
Будет ли процесс продолжаться и не зависнуть, когда я добавлю «ожидание» к этим методам?
Я просмотрел некоторые вопросы, связанные с этим, но не уверен, что они связаны/обновлены.
Многопроцессорность Python с асинхронным общим массивом numpy: пул против очереди
@freakish, я реорганизую существующий код синхронизации flask в асинхронный код fastAPI. Это невозможно?
Конечно, это возможно. Но это не значит, что вам нужно преобразовать каждую функцию в асинхронную. Просто оставьте пустые вещи как есть. Если вычисления numpy не занимают слишком много времени, в таком случае было бы лучше делегировать их в отдельный поток/процесс. И общаться с асинхронным fastAPI через некоторую очередь.






Я согласен с @freakish Вам следует прочитать:
Идея асинхронного кода состоит в том, чтобы приостановить выполнение и дождаться результатов из внешнего источника (например, файла, базы данных, сети). Такой подход приносит пользу вашему коду и сокращает время, необходимое для получения нескольких результатов, поскольку процессор обычно останавливается и ничего не делает во время ожидания. Если вам нужны ресурсы из сети, ваш код будет запрашивать их по одному, даже если эти запросы не влияют на процессор. С помощью асинхронных запросов (функций) вы можете запрашивать все ресурсы одновременно, позволяя процессору тем временем выполнять другие задачи.
Numpy не поддерживает асинхронные задачи. Но даже если бы это было так, имел бы ли это какой-то смысл? Думаю, нет. Numpy выполняет задачи, связанные с процессором, поэтому преимущества не будет. Если вы используете методы Numpy в качестве асинхронных функций, ЦП все равно будет использоваться для вычисления результата. Программа будет заблокирована на этом методе до тех пор, пока она не завершится, прежде чем перейти к следующему.
Если по каким-либо другим причинам вам это нужно, как сказали @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
Numpy не поддерживает асинхронность. Добавление
awaitпросто приведет к сбою. При этом это, должно быть, проблема XY. Зачем вам нужно, чтобы numpy был асинхронным? Асинхронность не очень актуальна для задач, интенсивно использующих процессор. Это то, на чем специализируется numpy.