Задать вопрос
@fotis06

Не шарю в асинхронности и очереди в python, что читать, смотреть?

Написал скрипт на python, решил, что он может понадобиться кому-то ещё, запихал его в fastapi приложение. Проблема в том, что сам скрипт требует около 2-3 минут на выполнение и с несколькими пользователями одновременно это всё точно не будет работать. Что вы можете посоветовать, чтобы разобраться во всём этом?
  • Вопрос задан
  • 154 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@chemdev
Если выполняется так долго, я бы сделал следующим образом:
Создал бы приложение celery с задачей, сделал бы ручку апи, которая запускает задачу и отдает ссылку на результат, ссылка на результат отдает либо "еще выполняется", либо результат.
Либо, вместо ссылки на результат, можно отправлять его на email.
Я бы написал docker-compose.yml с контейнерами api, nginx, celery, redis, но можно развернуть все любым удобным способом, это не обязательно.
Ответ написан
@Everything_is_bad
Что вы можете посоветовать, чтобы разобраться во всём этом?
начни с чтение оф доков по библиотеки asyncio
Ответ написан
Комментировать
@alekssamos
Программист любитель
В этом коде задачи будут добавляться в очередь без ожидания и выполняться по одной.
import logging
import asyncio

q = asyncio.Queue()


async def a_difficult_task(some_arg):
    print(f"task {some_arg} started")
    await asyncio.sleep(120)
    print(f"task {some_arg} ended")


async def worker():
    while True:
        try:
            some_arg = await q.get()
            await a_difficult_task(some_arg=some_arg)
        except (KeyboardInterrupt, SystemExit, SystemError):
            break
        except Exception:
            logging.exception("...")
        finally:
            q.task_done()


async def main():
    asyncio.create_task(worker())
    print("Adding tasks to queue")
    for x in range(1, 7):
        await q.put( x )
    print("Tasks added to queue")
    while True:
        await asyncio.sleep(1)


if __name__ == "__main__":
    asyncio.run(main())
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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