Поддерживает ли Python numpy asyncio?

Мне нужно переместить код синхронизации, включая методы numpy, в асинхронный код. Я пытался найти документацию по нему, но ничего не нашел.

Я использую следующие методы:

array
datetime64
where

Будет ли процесс продолжаться и не зависнуть, когда я добавлю «ожидание» к этим методам?

Я просмотрел некоторые вопросы, связанные с этим, но не уверен, что они связаны/обновлены.

Многопроцессорность Python с асинхронным общим массивом numpy: пул против очереди

np.unique блокирует процессор с помощью asyncio.to_thread

Numpy не поддерживает асинхронность. Добавление await просто приведет к сбою. При этом это, должно быть, проблема XY. Зачем вам нужно, чтобы numpy был асинхронным? Асинхронность не очень актуальна для задач, интенсивно использующих процессор. Это то, на чем специализируется numpy.

freakish 02.05.2024 13:03

@freakish, я реорганизую существующий код синхронизации flask в асинхронный код fastAPI. Это невозможно?

Leah 02.05.2024 13:38

Конечно, это возможно. Но это не значит, что вам нужно преобразовать каждую функцию в асинхронную. Просто оставьте пустые вещи как есть. Если вычисления numpy не занимают слишком много времени, в таком случае было бы лучше делегировать их в отдельный поток/процесс. И общаться с асинхронным fastAPI через некоторую очередь.

freakish 02.05.2024 14:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
168
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я согласен с @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

Другие вопросы по теме