我正在使用库中的一个长时间运行的函数,该函数主要从 CLI 调用,状态由 print 语句显示。像这样的东西:
def long_running_function():
...
LOGGER.info("first thing done")
...
LOGGER.info("second thing done")
...
但现在我想从网页触发相同的功能并将这些打印语句流式传输到浏览器。
在 FastAPI 中,看起来像 我应该使用服务器发送事件,但这需要一个生成消息的函数。像这样:
async def long_running_stream():
while True:
yield "data: message\n\n"
有没有办法将这些 LOGGER 语句猴子补丁为“yield”语句?如果我从 long_running_stream() 内部调用 long_running_function() ,这还能工作吗?
或者有更好的方法吗?
有没有办法将这些 LOGGER 语句猴子补丁为“yield”语句?
基本上:没有。我假设您无法控制
long_running_stream
的实现。 (如果您确实拥有完全控制权,那么您可以根据需要更改它。)如果您随后修补 LOGGER.info
函数并使其异步,这将立即导致错误,因为 long_running_stream
不是异步的。
SSE 本身不需要异步处理。 FastAI 或其他库可以使用异步函数生成它们,但这不是必需的。同步 API(例如在请求库中使用的)也可以处理流。
我想从网页触发相同的功能并将这些打印语句流式传输到浏览器。
我假设您的意思是,您想要在服务器端触发该函数并将 SSE 从服务器流式传输到 Web 客户端/浏览器。示例代码(同步和异步,使用 FastAI)可以在以下位置找到: https://www.workfall.com/learning/blog/how-to-stream-json-data-using-server-sent-events-and-fastapi-in-python-over-http/