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

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

Войти через TM ID
Похожие вопросы
Ivideon Москва
от 150 000 до 230 000 руб.
от 70 000 до 120 000 руб.
Popmechanic Москва
от 100 000 до 150 000 руб.
16 авг. 2018, в 09:18
30000 руб./за проект
16 авг. 2018, в 08:17
600 руб./в час
15 авг. 2018, в 23:38
300 руб./за проект