@Herben

Как добавить синхронность в асинхронный код?

У меня есть асинхронный телеграм бот, мне нужно, чтобы условно функция 1 выполнялась по очереди её вызовов, то есть 3 пользователя её вызвали и каждый получит от неё ответ синхронно, сначала 1 получит ответ, потом 2 и 3, но чтобы при этом не блокировались от выполнения другие асинхронные функции, как это можно реализовать?

Примерный код:
import asyncio

async def first():
    print('321')
    await asyncio.sleep(1)
    print('123')

def second(): #Эта функция не будет отвечать пока не ответ предыдущему вызвавшему её
    pass #Тут должны быть какие-то действия

async def third():
    print('123')
    await asyncio.sleep(1)
    print('321')


Думаю, понятно объяснил идею

Всё что я нашёл это: https://stackoverflow.com/questions/43241221/how-c...
но я глянул ответы и понял, что ничего не понял
(простите если туплю)

Заранее огромное спасибо!
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну во-первых, задумайся: что значит "три пользователя её вызвали"?
Время доставки пакета по сети неравномерно. Первый пользователь мог нажать "Отправить" чуть раньше, но его сообщение будет доставлено после второго. Так что вопрос обеспечения корректного порядка УЖЕ непрост.
Далее, ключевая идея аснихронности как раз в том, что во время паузы в обслуживании одного запроса мы можем заниматься другим запросом.

Включая режим Ванги, я могу предположить, что в твоём боте используются глобальные переменные для хранения данных, и ты споткнулся о ситуацию, когда при приходе двух близких по времени запросов их значения перезаписываются. И вместо того, чтобы это исправить с помощью организации данных как хранилища ключ-значение (ид пользователя - сохранённые данные), ты пытается поставить пользователей в очередь.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект