Sam Vandenabeele
Sam Vandenabeele

Reputation: 1

Flask-Socketio not emitting in worker thread

I have a program with a queue and a worker thread that executes everything in the queue. When the thread is done processing a job, it should emit some data. It says it is emitting, but the client side doesn't receive the message. When I emit something using the exact some command in the test endpoint, it does work.

from flask import Flask, render_template, request, session 
from flask_socketio import SocketIO, emit
from threading import Thread
from queue import Queue
import time

app = Flask(__name__)
socketio = SocketIO(app, engineio_logger=True, logger=True, cors_allowed_origins="*")
job_queue = Queue()

def worker():
    while True:
        sid, job = job_queue.get()
        if job is None:
            break

        print(f"Processing {job}", flush=True)
        time.sleep(2)
        
        
        socketio.emit("response", {"filename": job}, to=sid)
        print(f"Emitted response to {sid}", flush=True)

@app.route('/')
def index():
    return render_template('test.html')

@app.route("/test", methods=["POST"])
def test():
    sid = request.args.get('sid')
    job_queue.put((sid, "test"))
    socketio.emit("response", {"filename": "test"}, to=sid)
    return "OK", 200

@socketio.on('connect', namespace='/')
def connected():
    print("Connected", flush=True)

if __name__ == '__main__':
    Thread(target=worker, daemon=True).start()
    socketio.run(app, debug=True)

I have added the sid as a parameter to the emit, because clients are given a room with their sid name. Like this I can get past the 'socketio emitting out of scope' error.

I have also tried to use socketio.start_background_task(), but this did'nt work either.

Upvotes: 0

Views: 12

Answers (0)

Related Questions