代码之家  ›  专栏  ›  技术社区  ›  Hussein

在Tornado Websockets服务器上共享价值

  •  0
  • Hussein  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   xyres    7 年前

    在方法中 on_message() ,每次新消息到达时,您都在实例化 objectTV objectTv = operate() operate 类的初始状态设置为 'mutual' ,这就是它打印的原因 “相互”

    objectTV = operate() 线路自

    但是请阅读一些关于这个问题的答案: 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'