매우 인기있는 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.
은 결코 콘솔에 출력되지 않기 때문에 소켓이 변수 범위 지정 문제가 아닌 목록에 추가되지 않는다고 생각하게 만듭니다.
. 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