Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

332
Vistas
Python: envía datos cada 10 segundos a través de socket.io

Tengo una pregunta muy similar a esta: enviar datos cada 10 segundos a través de socket.io

Pero: Mi servidor está escrito en Python, el cliente está en JavaScript

La meta:

  • Los clientes se conectan al servidor a través de socket.io
  • Los clientes reciben ping de mensajes push del servidor cada n segundos
  • Cuando un cliente envía un mensaje ping , el servidor transmite un mensaje pong

Que funciona:

  • La conexión Socket.io funciona bien
  • El ping del cliente es recibido por el servidor, respondido con pong , que nuevamente es recibido por el cliente
  • El servidor ejecuta ping_in_intervals cada 5 segundos

Lo que no funciona:

  • Cuando el servidor ejecuta ping_in_intervals (lo que activa el envío de un ping ), ningún cliente recibe ese ping .
  • Cuando el bucle ping_in_intervals está activo, las conexiones de socket fallan aproximadamente cada minuto. Si el método está comentado, la conexión del socket se mantiene estable.

Observaciones:

  • El subproceso en el que se ejecuta ping_in_intervals no parece funcionar correctamente junto con el subproceso del servidor wsgi.
  • El subproceso ping_in_intervals desestabiliza el subproceso del servidor, lo que hace que se pierdan las conexiones (que se restablecen de inmediato, pero se caen cada minuto más o menos)
  • Creo que estoy haciendo algo terriblemente mal con el enhebrado. Tengo muy poca experiencia con subprocesos en Python y no sé dónde buscar el problema.

Servidor:

 import eventlet import socketio import threading sio = socketio.Server(cors_allowed_origins="*", async_mode='eventlet') app = socketio.WSGIApp(sio) def ping_in_intervals(): threading.Timer(5.0, ping_in_intervals).start() print("send ping") sio.emit('ping') @sio.on('ping') def ping(*args): print("received ping - send pong") sio.emit('pong') ping_in_intervals() eventlet.wsgi.server(eventlet.listen(('', 8080)), app)

Cliente:

 const socket = io.connect('localhost:8080', {secure: true, transports: ['websocket']}); socket.on('pong', () => { console.log('received pong'); }); socket.on('ping', () => { console.log('received ping'); }); socket.on('connect', () => { socket.emit('ping') });
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Encontré la solución en https://github.com/miguelgrinberg/python-socketio/blob/main/examples/server/wsgi/app.py#L16-L22

El subproceso, que envía mensajes del servidor cada n segundos, no debe iniciarse mediante threading , sino mediante la función start_background_task de socketio .

Aquí está el código de trabajo:

 import eventlet import socketio sio = socketio.Server(cors_allowed_origins="*", async_mode='eventlet') app = socketio.WSGIApp(sio) def ping_in_intervals(): while True: sio.sleep(10) sio.emit('ping') @sio.on('ping') def ping(*args): sio.emit('pong') thread = sio.start_background_task(ping_in_intervals) eventlet.wsgi.server(eventlet.listen(('', 8080)), app)
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda