Skip to content

Instantly share code, notes, and snippets.

@hholst80
Created January 23, 2021 18:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hholst80/683dbfd4093bb7e5824e21189efe92f5 to your computer and use it in GitHub Desktop.
Save hholst80/683dbfd4093bb7e5824e21189efe92f5 to your computer and use it in GitHub Desktop.
SSE events
import sys
import queue
from concurrent.futures import ThreadPoolExecutor
import flask
app = flask.Flask(__name__)
executor = ThreadPoolExecutor(max_workers=3)
def format_sse(data, event=None):
if event is not None:
msg = 'event: %s\ndata: %s\n\n' % (event, data)
else:
msg = 'data: %s\n\n' % data
return msg
@app.route("/", methods=["GET"])
def method():
q = queue.Queue(10)
def job():
#print('started', file=sys.stderr)
q.put_nowait('started')
#print('sleeping for 2 seconds', file=sys.stderr)
#time.sleep(2)
#print('almost done (50%)', file=sys.stderr)
q.put_nowait('almost done (50%)')
time.sleep(2)
#print('99%', file=sys.stderr)
q.put_nowait('99%')
time.sleep(2)
#print('100% - done!', file=sys.stderr)
q.put_nowait('100% - done!')
q.put_nowait(None)
q.join()
#print('consumer done')
def stream():
while True:
print('fetching item from q', file=sys.stderr)
item = q.get()
print('got item: %s' % item, file=sys.stderr)
if item is None:
q.task_done()
break
yield format_sse(item)
q.task_done()
executor.submit(job)
return flask.Response(stream(), mimetype='text/event-stream')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment