@AlexMine
Учусь

Как обрабатывать данные асинхронно, а отдавать в порядке поступления?

Добрый день, есть у меня 2 корутины, в первую приходят сообщения от сервера, а вторая обрабатывает данные и формирует ответ. Сейчас логика следующая, первая постоянно работает и когда приходит сообщение, она создаёт с помощью asyncio.create_task задание с 2 корутиной, передает туда сообщение и переходит к следующим сообщениям. 2 корутина отрабатывает за 2-5 секунд. Проблема в том, что если приходят 2 сообщения подряд и 2 обрабатывается позже чем 1 сообщение, то пользователь получает сначала 2, а потом 1 сообщение. Можно ли как-то сделать так, чтобы сообщения обрабатывались одновременно, но посылались в порядке очереди их приема? Хотел использовать gather, но тогда нужно ждать пока выполнятся изначально пришедшие сообщения, а потом только заново запускать вновь пришедшие, может быть есть возможность в gather на лету добавлять новые таски? Использую только asyncio и aiohttp
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
@davGro
Шушуть люблю питон, по шушуть тыкаю где-то год.
Костыльное решение, но можно в словарь добавлять готовые сообщения с указанием его номера, а потом отправлять их в порядке очереди.
Ниже псевдокод примера:
queue = {}
queue[2] = 'message from cor 2'
queue[1] = 'message from cor 1' 
queue[3] = 'message from cor 3' 
# >>> queue
# {2: 'message from cor 2', 1: 'message from cor 1', 3: 'message from cor 3'}

queue = dict(sorted(queue.items()))
# >>> queue
#     {1: 'message from cor 1', 
#      2: 'message from cor 2', 
#      3: 'message from cor 3'}
...
for message in queue:
    await send(queue.pop(0)) # отправляет первый элемент
                             # в словаре, удаляя его, он нам не нужен более

# таким образом, сообщения отправятся в заданном порядке,
# главное сохранять их в нужном :)

Спасибо этой странице за решение сортировки словаря по ключу
Я надеюсь, мое решение вам помогло, я старался над ним
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы