Cliente websocket no bloqueado

Estoy deseando ejecutar un progtwig en Python que envía un mensaje cada segundo a través de sockets web a un servidor Tornado. He estado usando el ejemplo en websocket-client;

Este ejemplo no funciona, porque ws.run_forever() detendrá la ejecución del bucle while.

¿Alguien me puede dar un ejemplo de cómo implementar esto correctamente como una clase con hilos a la que puedo llamar el método de envío pero también recibir mensajes?

 import websocket import thread import time def on_message(ws, message): print message def on_error(ws, error): print error def on_close(ws): print "### closed ###" def on_open(ws): pass if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close) ws.on_open = on_open ws.run_forever() while True: #do other actions here... collect data etc. for i in range(100): time.sleep(1) ws.send("Hello %d" % i) time.sleep(1) 

Hay un ejemplo en su página de github que hace exactamente eso. Parece que usted comenzó a salir de ese ejemplo y tomó el código que envía mensajes cada segundo de on_open y lo pegó después de la llamada run_forever , que BTW se ejecuta hasta que se desconecta el zócalo.

Tal vez usted está teniendo problemas con los conceptos básicos aquí. Siempre habrá un subproceso dedicado a escuchar el zócalo (en este caso, el subproceso principal que entra en un bucle dentro del run_forever esperando mensajes). Si quieres tener otra cosa, necesitarás otro hilo.

A continuación se muestra una versión diferente de su código de ejemplo, donde en lugar de usar el hilo principal como el “escucha de socket”, se crea otro hilo y el run_forever se ejecuta allí. Lo veo como un poco más complicado ya que tienes que escribir código para asegurarte de que el zócalo se haya conectado mientras puedas usar la devolución de llamada on_open , pero tal vez te ayude a comprender.

 import websocket import threading from time import sleep def on_message(ws, message): print message def on_close(ws): print "### closed ###" if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_close = on_close) wst = threading.Thread(target=ws.run_forever) wst.daemon = True wst.start() conn_timeout = 5 while not ws.sock.connected and conn_timeout: sleep(1) conn_timeout -= 1 msg_counter = 0 while ws.sock.connected: ws.send('Hello world %d'%msg_counter) sleep(1) msg_counter += 1