gpt4 book ai didi

python - 后台线程记录到 Flask 应用程序中的服务器发送事件流

转载 作者:行者123 更新时间:2023-12-03 13:12:38 25 4
gpt4 key购买 nike

我正在尝试构建一个在后台运行一些任务的 Flask 应用程序。此任务( worker )使用标准 logging用于记录正在发生的事情的模块。我想使用 Server Sent Events 将日志消息直接推送到 Web 浏览器,但无法让 gevent 广播它们.

在以下代码段中,worker 已正确启动,SSEHandler.emit方法被调用,但 notify在我执行 gevent.spawn 之后似乎没有执行函数.

主文件

import gevent
from gevent.wsgi import WSGIServer
from gevent.queue import Queue

from flask import Flask, Response

import time
import logging
import threading
from worker import Worker

class SSEHandler(logging.Handler):

def __init__(self):
logging.Handler.__init__(self)
self.subscriptions = []

def emit(self, record):
try:
msg = self.format(record)
print "sending", msg
def notify(subs, msg):
print "broadcasting!"
for sub in subs[:]:
sub.put(msg)

gevent.spawn(notify, self.subscriptions, msg)

except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)

def subscribe(self):
print "subscribed"
q = Queue()
self.subscriptions.append(q)
try:
while True:
result = q.get()
yield "data: %s\n\n"%result
except GeneratorExit: # Or maybe use flask signals
subscriptions.remove(q)



app = Flask(__name__)
handler = SSEHandler()
handler.setLevel(logging.DEBUG)
worker = None

# Client code consumes like this.
@app.route("/")
def index():
debug_template = """
<html>
<head>
</head>
<body>
<h1>Server sent events</h1>
<div id="event"></div>
<script type="text/javascript">

var eventOutputContainer = document.getElementById("event");
var evtSrc = new EventSource("/subscribe");

evtSrc.onmessage = function(e) {
console.log(e.data);
eventOutputContainer.innerHTML = e.data;
};

</script>
</body>
</html>
"""
return(debug_template)


@app.route("/subscribe")
def subscribe():
return Response(handler.subscribe(), mimetype="text/event-stream")

@app.route("/start")
def start():
def run():
global worker
global handler
worker = Worker(handler)
worker.go()

threading.Thread(target=run).start()
return "Going"

if __name__ == "__main__":
app.debug = True
server = WSGIServer(("", 5000), app)
server.serve_forever()

worker .py
import logging
import time

class Worker:
def __init__(self, handler):
self.log = logging.getLogger('sselog.worker.Worker')
self.log.setLevel(logging.DEBUG)
self.log.addHandler(handler)

self.log.info("Initialized")

def go(self):
i = 0
while True:
time.sleep(1)
self.log.info("I'm working so hard %u", i)
i+=1

最佳答案

好吧,问题是我使用纯线程和 sleep 而不是 gevent 的东西。更改它和/或应用猴子补丁后,一切正常。

关于python - 后台线程记录到 Flask 应用程序中的服务器发送事件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24892418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com