【问题标题】:It is possible to update a value in loop可以在循环中更新值
【发布时间】:2016-05-24 09:14:21
【问题描述】:

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

【问题讨论】:

  • 我认为将你的代码提炼成一个简单的例子来捕捉你的问题的本质会很好,这听起来像是一个基本的python问题。这种方式更通用(即对未来的读者有帮助),我们不需要解析大量的 WebSocket 代码。
  • 你的缩进被破坏了。由于缩进在 python 中在语法上很重要,所以在你修复它之前讨论这个是没有用的。

标签: python tornado


【解决方案1】:

Tornado 监听消息并在每次收到新消息时执行“on_message”。因此,您对收到的每条消息都执行无限循环,这不是您想要的。

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

相反,您应该运行一些异步代码。您可以在 tornado 文档或 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)

我对 tornado 和 asyncio 库不太熟悉,所以可能有更好的方法来做你想做的事情。

【讨论】:

  • 不幸的是,它不起作用...将打印相同的值。当我发送新值时,它不会循环更改。
  • 显示产生错误结果的代码。在您问题的代码中,没有任何改变。
  • 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)
  • 您的updateMessage 除了简单地返回消息外,什么都不做。应该如何修改?另外请使用该代码编辑您的原始问题,使其更具可读性。
  • 你需要按照你想要的方式修改字符串。例如。 message = message + "a" 或任何你想要的。你到底想要什么?
猜你喜欢
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2017-02-03
  • 2013-04-29
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多