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

Python tornado как сделать ответы асинхронными?

Всем привет, подскажите. Пишу WebSocket сервер на Tornado.
Алгоритм следующий:
-Человек подключается к серверу
-Передает в message - параметры {param1: 1, param2: 2}
-Сервер на основе этих параметров из бд выдает ответы, т.е., что-то вроде live-ленты. Каждые 10 секунд в бесконечном цикле с time.sleep отправляет результаты. И все хорошо, но в таком режиме работает он только с 1 клиентом.
Если, просто, закрыть вкладку, то соединение так и виснет. И сервер не принимает новых сообщений
class capitalizationHandler(Handler.WebSocketHandler): #Наследую от измененного Handler'a Tornado (Ничего там интересного, просто, уменьшил код
    @tornado.web.asynchronous
    def on_message(self, message):

        while True:
            response = requests.get(url) #Через reuquests, да-да, простите меня

            if response.status_code != 200:
                self.write_message(u"bad parameters #3")
                print(url)
                break

            self.write_message(response.content)

            time.sleep(Config.script2Pause) #Config.script2Pause = 10 сек

if __name__ == '__main__':
    ws_app = Application()
    server = tornado.httpserver.HTTPServer(ws_app)
    server.listen(8808)
    tornado.ioloop.IOLoop.instance().start()
  • Вопрос задан
  • 322 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
time.sleep() - это блокирующаяся операция. Нельзя блокировать асинхронный код. Используйте yield gen.sleep(Config.script2Pause).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽