python - Python:服务器请求/响应生命周期中长时间运行的流式传输任务
问题描述
当脚本由 HTML/AJAX 请求启动时,如何使长时间运行的脚本在请求/响应生命周期之外保持活动状态?
背景:
我有一个带有特定端点的 Django 应用程序,该端点使用StreamingHttpResponse将结果流回客户端。一般来说,这运作良好。我有一系列生成器,它们将每个结果保存到数据库中,将它们的结果生成给 StreamingHttpResponse,并且客户端在收到每个结果后立即适当地显示它。
当客户端连接意外丢失时,就会出现问题。这会导致脚本突然停止,因为 Django 关闭了连接。我想提出一些机制,通过该机制可以继续执行长时间运行的脚本,以便可以处理所有结果并将其保存到数据库中。然后,用户可以在重新连接到服务器后检索结果。
代码
这是当前代码的一般结构:
def ajax_stream_results(request):
data = json.loads(request.body)
params = data['parameters']
def results_generator(params):
# Process result 1
result1 = param1 * xyz
# Save result 1 to database
db_save(result1)
# Stream result1 to client
yield result1
.
.
.
#Process result 32
result32 = param32 * xyz
# Save result 32 to database
db_save(result32)
# Stream result32 to client
yield result32
return StreamingHttpResponse(results_generator(params))
将results_generator
结果保存到数据库,产生每个连续的结果,并在客户端连接处于活动状态时继续流式传输数据。在理想情况下,我们可以找到一种解决方案来保持运行,results_generator
以便即使客户端连接失败并且结果无法再流式传输到客户端,数据也可以保存到数据库中。
要求:
该解决方案应该允许结果流(我们目前拥有),而且即使客户端流意外死亡,也要保持脚本处于活动状态以继续处理结果。
解决方案的简单性:
我想让这个解决方案尽可能简单。这似乎是一个相对常见的问题,但我的搜索结果只产生了非常复杂的解决方案。即使我使用的是 Django,我认为我的问题的答案将与任何 Python 客户端/服务器库相关。
我知道最新版本的 Django 支持 async/websockets,但升级将是一个大规模的代码重构。我知道我可以实现某种排队(芹菜),但这对于具有一个脚本的单个端点来说似乎太复杂了,我认为我们也可能会失去流式传输结果的能力。
任何解决方案:
如果真的没有简单的解决方案来处理流结果和保持脚本活着,请将您最好/最喜欢的复杂解决方案发送给我!;-)
解决方案
推荐阅读
- google-custom-search - 如何免费使用 Google 自定义搜索广告?
- javascript - 使用nodejs服务器命中角度路线时出错
- python - 无法导入名称“etree”
- c++ - 离散傅里叶变换 C++
- c# - 用 mathnet 解决一般特征问题
- jquery - 如何在jQuery代码中使用用角度定义的数组
- javascript - 如何调试 JavaScript 对象问题?
- java - java listFiles() 只返回文件
- http - ASP.Net Core 2(.1.2) - 无需信任客户端即可保存用户数据
- javascript - 如何在 Angular Typescript 中访问此关键字