Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

327
Visualizações
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')
});

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

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)
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda