[英]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.