2014-12-23 2 views
2

매우 인기있는 Tornado server for Python을 사용하여 WebSocket 서버를 만들려고하지만 클래스 외부의 웹 소켓에 데이터를 쓰려면 전역 범위의 self 변수를 만드는 데 문제가 있습니다.WebSocket 전역 변수를 사용하여 스레딩

This answer 내 문제가 정확히 해결되었지만 한 걸음 더 나아가서 모든 것을 하나의 스레드로 감싸고 싶었습니다.

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); 

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) 

이 소켓에 쓰는 클래스의 외부에하는 방법입니다 :

내 소켓입니다

이상한 점은 코드가 Thread 클래스로 래핑되지 않은 경우 쓰기 m ethod는 잘 작동합니다. 위의 코드에서 내가 전화 할 때 :

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

답변

관련 문제