可以循环更新值

时间:2016-05-24 09:14:21

标签: python tornado

我试图将值更新为无限循环,而不退出循环。此值作为参数从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客户端发送的新值)。但是现在它只打印了第一条消息(值),因为循环。

1 个答案:

答案 0 :(得分:0)

每次收到新邮件时,Tornado都会监听邮件并执行“on_message”。所以你为你得到的每条消息执行无限循环 ,这不是你想要的。

其次我认为龙卷风默认使用单个进程和线程,因此如果用无限循环阻止它,它就无法接收更多消息。

相反,你应该运行一些异步代码。您可以在tornado documentatio或python 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库并不熟悉,所以可能有更好的方法来做你想做的事。