我試圖創建一個使用非常受歡迎的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.
從不打印到控制檯,使我認爲套接字永遠不會附加到列表,而不是它是一個變量範圍問題。
我不能重現此。 https://gist.github.com/binux/2e1c7b3b2b8de18f950c您的程序中是否有其他線程? tornado.ioloop.IOLoop.instance()是一個進程共享的IOLoop對象,從線程啓動它並不好。 – Binux
這是我到目前爲止:http://pastebin.com/S4hkDRqg 'send_data(self,message)'中的print語句不能按預期工作,並且套接字不寫'Ping!' –
不應該在thread.start之後馬上send_data。因爲還沒有連接websocket。 – Binux