Задать вопрос
@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()
  • Вопрос задан
  • 320 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
time.sleep() - это блокирующаяся операция. Нельзя блокировать асинхронный код. Используйте yield gen.sleep(Config.script2Pause).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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