[英]Share a value across Tornado Websockets server
我有一个在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())
但是它总是打印“相互”吗?
在on_message()
方法中,每次on_message()
新消息时,您都会在objectTv = operate()
处一次又一次地实例化objectTV
。 新的operate
类实例的初始状态设置为'mutual'
,这就是为什么它打印'mutual'
。
一个简单的修复方法是从on_message()
删除objectTV = operate()
行,并且它应该可以像您希望的那样工作。
但是请阅读有关此问题的一些答案: 为什么全局变量有害? 。
因此,解决问题的更好方法是在处理程序实例上设置本地属性:
class EchoWebSocket(websocket.WebSocketHandler):
...
def open(self):
self.objectTV = operate()
self.objectTV.play()
def on_message(self, message):
print(self.objectTV.getStatus()) # -> 'play'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.