簡體   English   中英

在Tornado Websockets服務器上共享價值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM