我正在开发的web应用程序需要执行的任务太长,无法在http请求/响应周期内执行。通常,用户将执行请求,服务器将接受此请求,除其他外,运行一些脚本来生成数据(例如,用povray呈现图像)。
当然,这些任务可能需要很长时间,因此在向客户端发送响应之前,服务器不应该挂起脚本来完成执行。因此,我需要执行脚本异步,并给客户机一个“资源在这里,但还没有准备好”,并可能告诉它一个ajax端点轮询,这样它就可以在准备好时检索和显示资源。
现在,我的问题与设计无关(虽然我也非常喜欢这方面的任何提示)。我的问题是:解决这个问题的系统是否已经存在,所以我没有重新发明方轮?如果有必要,我将使用流程队列管理器提交任务,并将HTTP端点发送给ajax客户端,比如“未决”、“中止”、“已完成”,但是如果已经存在类似的任务,我会非常喜欢它。
我在python+django工作。
编辑:请注意,这里的主要问题不是服务器和客户端如何协商和交换有关任务状态的信息。
问题是服务器如何处理非常长的任务的提交和队列。换句话说,我需要一个比让我的服务器在LSF上提交脚本更好的系统。不是说它不起作用,但我觉得有点太.
编辑2:我添加了一个赏金,看看能否得到其他答案。我检查了pyprocessing,但不能在稍后阶段执行作业提交并重新连接到队列。
发布于 2009-12-02 02:22:16
你应该避免在这里重新发明轮子。
看看变速工。它在许多语言(包括python)中都有库,并且相当流行。不确定是否有任何现成的方法可以轻松地将django连接到gearman和ajax调用,但是自己做这个部分不应该很复杂。
基本思想是运行gearman作业服务器(或多个作业服务器),让web请求用一些参数(如'{photo_id: 1234}')将作业排队(如‘photo_id’)。您可以将其排队作为后台任务。你可以把手柄拿回来。然后,ajax请求将轮询该句柄值,直到它被标记为完整为止。
然后,您有一个工作人员(或者可能有很多),它是一个单独的python进程,连接到这个作业服务器,并为'resize_photo‘作业注册自己,完成工作,然后将其标记为完整。
我还发现这个博客帖子很好地总结了它的用法。
发布于 2009-11-17 12:07:25
您可以尝试两种方法:
"loading",每次接收新数据时都需要收集新信息。关于第二个选项,您可以通过阅读彗星来了解更多信息;使用ASP.NET,您可以通过实现System.Web.IHttpAsyncHandler接口来做类似的事情。
发布于 2009-11-30 07:18:35
我不知道有一个系统能做到这一点,但要实现自己的系统是相当容易的:
有一些边缘的情况需要处理,所以一个现有的框架显然会更好,正如你说的。
https://stackoverflow.com/questions/1748413
复制相似问题