Не будет ли этот код блокировать асинхронный код?

У меня есть вот такой
код
import asyncio
import datetime
import random
from functools import wraps, partial

import plotly.express as px


def async_wrap(func):
    @wraps(func)
    async def run(*args, loop=None, executor=None, **kwargs):
        if loop is None:
            loop = asyncio.get_event_loop()
        pfunc = partial(func, *args, **kwargs)
        return await loop.run_in_executor(executor, pfunc)

    return run


@async_wrap
def get_plot_bytes() -> bytes:
    now = datetime.datetime.now()
    data = {now.replace(day=now.day + i): random.randint(1, 10) for i in range(10)}
    fig = px.area(x=list(data.keys()), y=list(data.values()), title='Статистика покупок')
    fig.update_layout(xaxis_title="Дата", yaxis_title="Количество покупок")
    return fig.to_image('png')


async def main():
    await get_plot_bytes()


if __name__ == '__main__':
    asyncio.new_event_loop().run_until_complete(main())
для создания графика. И вот я решил на всякий случай узнать, будет ли блокировать этот код асинхронный код (код бота, aiogram)
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Проблема в том, что в Питоне потоки немножко увечные (ключевое слово GIL), а потому реально работают только в двух случаях:
1. Исполняемый длительный код написан не на питоне, а принадлежит одному из бинарных модулей
2. Исполняемый код большую часть времени ждёт (например, операции ввода/вывода).
В случае с многопроцессностью проблем меньше, но появляетя проблема обмена данными между процессами.

Я бы запустил несколько процессов воркеров, которые умеют рендерить предоставленные данные и возвращать график как массив байт, содержащий изображение. Тогда основной бот кидает задание в некую очередь, один из воркеров просыпается, рендерит задание, и кладёт ответ в другую очередь. Словом, паттерн поставщик-потребитель. Конечно, могут быть проблемы с тем, чтобы подружить multiprocessing.Queue с асинхронным кодом, но имхо так всё равно изящнее.
Более того, если искомые данные лежат в БД или ином внешнем источнике - можно нагрузить воркеров их извлечением. Тогда задание будет содержать в себе только критерии выборки данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы