Reputation: 1
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