首页 > 解决方案 > 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,但升级将是一个大规模的代码重构。我知道我可以实现某种排队(芹菜),但这对于具有一个脚本的单个端点来说似乎太复杂了,我认为我们也可能会失去流式传输结果的能力。

任何解决方案:

如果真的没有简单的解决方案来处理流结果和保持脚本活着,请将您最好/最喜欢的复杂解决方案发送给我!;-)

标签: pythondjangoflaskserverclient

解决方案


推荐阅读