2014-12-23 65 views
2

我試圖創建一個使用非常受歡迎的Tornado server for Python的WebSocket服務器,但我在創建全局作用域變量以便將數據寫入類外的Web套接字時遇到了問題。使用全局變量的WebSocket線程處理

This answer確切地解決了我的問題,但我想要更進一步,並將整個事件包裝在一個線程中。

這是我的插座:

wss = [] 

class WSHandler(tornado.websocket.WebSocketHandler): 

    def check_origin(self, origin): 
     return True 

    def open(self): 
     print ('New connection established.') 
     if self not in wss: 
      wss.append(self) 

    def on_message(self, message): 
     print ('Received message: %s' % message) 

    def on_close(self): 
     print ('Connection closed.') 
     if self in wss: 
      wss.remove(self) 

這是是寫入套接字類以外的方法:

def write_data(message): 
    for ws in wss: 
     print ("Sending: %s" % message) 
     ws.write_message(message); 

這是線程服務器類:

class ServerThread(threading.Thread): 

    def run(self): 
     print ("Starting server.") 
     http_server = tornado.httpserver.HTTPServer(application) 
     http_server.listen(4045) 
     main_loop = tornado.ioloop.IOLoop.instance() 
     main_loop.start() 

    def send_data(self, message): 
     write_data(message); 

奇怪的是,當代碼不包含在Thread類中時,寫入m方法工作正常。在上面的代碼中,當我打電話時:

server_thread = ServerThread() 
server_thread.start() 
server_thread.send_data("Ping!") 

沒有任何反應。輸入方法write_data(message),但顯然wss[]爲空。

任何幫助你可以提供將不勝感激!

更新:

我一直在不斷地尋找到這個問題無濟於事。另一個奇怪的事情:New connection established.從不打印到控制檯,使我認爲套接字永遠不會附加到列表,而不是它是一個變量範圍問題。

+0

我不能重現此。 https://gist.github.com/binux/2e1c7b3b2b8de18f950c您的程序中是否有其他線程? tornado.ioloop.IOLoop.instance()是一個進程共享的IOLoop對象,從線程啓動它並不好。 – Binux

+0

這是我到目前爲止:http://pastebin.com/S4hkDRqg 'send_data(self,message)'中的print語句不能按預期工作,並且套接字不寫'Ping!' –

+0

不應該在thread.start之後馬上send_data。因爲還沒有連接websocket。 – Binux

回答