2016-05-24 1 views
-4

Я пытаюсь обновить значение в бесконечном цикле, не выходя из цикла. Это значение отправляется как параметр из клиента WebSocket. Мой вопрос: как я могу обновить значение, которое находится внутри бесконечного цикла?Можно обновить значение в цикле

class WebSocketHandler(tornado.websocket.WebSocketHandler): 
    def open(self): 
     print('new connection') 
     clients.append(self) 
     self.write_message("connected") 
    def on_message(self, message): 
     print('tornado received from client: %s' % message) 
     new_message ="" 
     while True: 
      new_message=self.updateMessage(message) 
      print(new_message) 

    def updateMessage(self, message): 
     return(message) 

def main(): 
    parse_command_line() 
    app = tornado.web.Application(
     [ 
      (r"/ws", WebSocketHandler) 
     ], 
    template_path=os.path.join(os.path.dirname(__file__), "templates"), 
    static_path=os.path.join(os.path.dirname(__file__), "static") 
    ) 
    app.listen(options.port) 
    tornado.ioloop.IOLoop.current().start() 


if __name__ == "__main__": 
    main() 

Я хочу, чтобы напечатанное сообщение внутри цикла обновления с новым сообщением, которое получено в ON_MESSAGE функции. Если я удалю цикл while, будет напечатано новое сообщение (новое значение, отправленное клиентом Websocket). Но теперь на нем напечатано только первое сообщение (значение) навсегда, потому что цикл.

+0

Я думаю, было бы неплохо перевести ваш код на простой пример, который отражает суть вашего вопроса, который звучит как основной вопрос python. Это более общий способ (то есть полезен будущим читателям), и нам не нужно разбирать много кода WebSocket. – user20160

+1

Ваш отступ сломан. Поскольку вложение является синтаксически важным ** в python, бесполезно обсуждать это, пока вы не исправите это. –

ответ

0

Торнадо слушает сообщения и выполняет «on_message» каждый раз, когда принимается новое сообщение. Итак, вы выполняете бесконечный цикл за каждое полученное сообщение, которое не то, что вы хотите.

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

Вместо этого вы должны запустить некоторый асинхронный код. Вы можете прочитать больше в торнадо documentatio или питона asyncio документации, но должно работать:

class WebSocketHandler(tornado.websocket.WebSocketHandler): 

    newest_message = None 

    def open(self): 
     print('new connection') 
     clients.append(self) 
     self.write_message("connected") 

    def on_message(self, message): 
     print('tornado received from client: %s' % message) 
     self.newest_message = message 
     asyncio.ensure_future(show_newest_message()) 

    async def show_newest_message(self): 
     if self.newest_message is not None: 
      while True: 
       print(self.newest_message) 
       asyncio.sleep(1) 

Я не знаком с торнадо и asyncio библиотек, так что может быть более эффективные способы сделать то, что Вы хотите сделать.

+0

К сожалению, не работает ... Будет печать того же значения. Когда я отправлю новое значение, он не будет меняться в цикле. –

+0

Показать код, который производит неверные результаты. В коде вашего вопроса ничего не изменилось. – syntonym

+0

Защиту ON_MESSAGE (я, сообщение): печать ('Торнадо получил от клиента:% S' % сообщений) new_message = "" в то время как True: new_message = self.updateMessage (сообщение) печать (new_message) четкости updateMessage (self, message): return (message) –

 Смежные вопросы

  • Нет связанных вопросов^_^