在Tornado Websockets服务器上共享一个值

时间:2017-09-27 01:13:14

标签: python web-services tornado

我有一个在python中使用Tornado框架的基本websocket服务器。我想在服务器功能之间共享一个值:

class EchoWebSocket(websocket.WebSocketHandler):

    def check_origin(self, origin):
        return True
    def open(self):
        print ("connection opened")
    def on_close(self):
        tornado.ioloop.IOLoop.instance().stop()
        print ("connection closed")
    def on_message(self,message):
        print (message)

def Main():
    application = tornado.web.Application([(r"/", EchoWebSocket),])
    application.listen(9000)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    Main() 

我试图从这样的类创建一个全局对象:

class operate:
    state = "mutual"

    def __init__(self):
        self.state = 'mutual'

    def play(self):
        self.state = 'play'

    def pause(self):
        self.state = 'pause'

    def getStatus(self):
        return self.state 

并调用一个全局对象,猜测由于该对象是全局的,因此每个消息都不会创建一个新对象:

def open(self):
    global objectTV
    objectTV = operate()
    objectTV.play()
.
.
.
.
 def on_message(self,message):
        global objectTV
        objectTV = operate()
        print(objectTV.getStatus())

但是它总是打印出来的?#?

1 个答案:

答案 0 :(得分:1)

在方法on_message()中,每次收到新邮件时,您都会在objectTV一次又一次地实例化objectTv = operate()operate类的新实例的初始状态设置为'mutual',这就是它打印'mutual'的原因。

一个简单的解决方法是从objectTV = operate()删除on_message()行,它应该像你想要的那样工作。

但是在这个问题上阅读了一些答案:Why are global variables evil?

因此,解决问题的更好方法是在处理程序实例上设置本地属性:

class EchoWebSocket(websocket.WebSocketHandler):
    ...
    def open(self):
        self.objectTV = operate()
        self.objectTV.play()

    def on_message(self, message):
        print(self.objectTV.getStatus()) # -> 'play'