我试图将值更新为无限循环,而不退出循环。此值作为参数从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 :(得分: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库并不熟悉,所以可能有更好的方法来做你想做的事。