Company logo
  • Empleos
  • Bootcamp
  • Acerca de nosotros
  • Para profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
    • Bootcamp
  • Para empresas
    • Inicio
    • Nuestro proceso
    • Planes
    • Pruebas
    • Nómina
    • Blog
    • Calculadora

0

162
Vistas
Python: Send data every 10 seconds via socket.io

I have a question very similar to this one: Send data every 10 seconds via socket.io

But: My server is written in Python, the client is in JavaScript

The goal:

  • Clients connect to server via socket.io
  • Clients receive push messages ping from server every n seconds
  • When a client sends a ping message, the server broadcasts a pong message

What works:

  • Socket.io connection works fine
  • Client ping is received by server, answered with pong, which is again received by client
  • Server executes ping_in_intervals every 5 seconds

What doesn't work:

  • When server executes ping_in_intervals (which triggers sending a ping), that ping is not received by any client
  • When ping_in_intervals loop is active, socket connections crash every minute or so. If the method is commented out, then socket connection stays stable.

Observations:

  • The thread, that ping_in_intervals is running in doesn't seem to properly work together with the wsgi server thread.
  • The ping_in_intervals thread destabilizes the server thred, causes it to loose connections (which are reestablished right away, but they do drop every minute or so)
  • I think, that I'm doing something terribly wrong with threading. I have very little experience with threading in Python and don't know, where to look for the problem

Server:

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)

Client:

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

7 months ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Found the solution at https://github.com/miguelgrinberg/python-socketio/blob/main/examples/server/wsgi/app.py#L16-L22

The thread, which pushes server messages every n seconds, shouldn't be started using threading, but instead using the start_background_task function of socketio.

Here's the working code:

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)
7 months 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 empleo Planes Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2023 PeakU Inc. All Rights Reserved.