首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >web应用程序任务的异步执行

web应用程序任务的异步执行
EN

Stack Overflow用户
提问于 2009-11-17 12:03:56
回答 7查看 833关注 0票数 3

我正在开发的web应用程序需要执行的任务太长,无法在http请求/响应周期内执行。通常,用户将执行请求,服务器将接受此请求,除其他外,运行一些脚本来生成数据(例如,用povray呈现图像)。

当然,这些任务可能需要很长时间,因此在向客户端发送响应之前,服务器不应该挂起脚本来完成执行。因此,我需要执行脚本异步,并给客户机一个“资源在这里,但还没有准备好”,并可能告诉它一个ajax端点轮询,这样它就可以在准备好时检索和显示资源。

现在,我的问题与设计无关(虽然我也非常喜欢这方面的任何提示)。我的问题是:解决这个问题的系统是否已经存在,所以我没有重新发明方轮?如果有必要,我将使用流程队列管理器提交任务,并将HTTP端点发送给ajax客户端,比如“未决”、“中止”、“已完成”,但是如果已经存在类似的任务,我会非常喜欢它。

我在python+django工作。

编辑:请注意,这里的主要问题不是服务器和客户端如何协商和交换有关任务状态的信息。

问题是服务器如何处理非常长的任务的提交和队列。换句话说,我需要一个比让我的服务器在LSF上提交脚本更好的系统。不是说它不起作用,但我觉得有点太.

编辑2:我添加了一个赏金,看看能否得到其他答案。我检查了pyprocessing,但不能在稍后阶段执行作业提交并重新连接到队列。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-12-02 02:22:16

你应该避免在这里重新发明轮子。

看看变速工。它在许多语言(包括python)中都有库,并且相当流行。不确定是否有任何现成的方法可以轻松地将django连接到gearman和ajax调用,但是自己做这个部分不应该很复杂。

基本思想是运行gearman作业服务器(或多个作业服务器),让web请求用一些参数(如'{photo_id: 1234}')将作业排队(如‘photo_id’)。您可以将其排队作为后台任务。你可以把手柄拿回来。然后,ajax请求将轮询该句柄值,直到它被标记为完整为止。

然后,您有一个工作人员(或者可能有很多),它是一个单独的python进程,连接到这个作业服务器,并为'resize_photo‘作业注册自己,完成工作,然后将其标记为完整。

我还发现这个博客帖子很好地总结了它的用法。

票数 4
EN

Stack Overflow用户

发布于 2009-11-17 12:07:25

您可以尝试两种方法:

  • 若要,则每n间隔调用webserver并通知作业id;服务器处理该任务并返回有关该任务当前执行的一些信息。
  • 要实现长时间运行的页面,每n间隔发送一次数据;对于客户端,该HTTP请求“始终”是"loading",每次接收新数据时都需要收集新信息。

关于第二个选项,您可以通过阅读彗星来了解更多信息;使用ASP.NET,您可以通过实现System.Web.IHttpAsyncHandler接口来做类似的事情。

票数 1
EN

Stack Overflow用户

发布于 2009-11-30 07:18:35

我不知道有一个系统能做到这一点,但要实现自己的系统是相当容易的:

  • 创建包含jobid、作业参数、作业结果的数据库表
    • 作业结果是一个字符串,它将保存结果的泡菜。
    • 作业参数是一个经过筛选的输入参数列表。

  • 当服务器开始处理作业时,它会在表中创建一个新行,并跨越一个新进程来处理这个问题,并将该进程传递给该作业in。
  • 任务处理程序在表完成后更新表中的作业结果。
  • 网页(xmlrpc或您正在使用的任何内容)包含一个方法'getResult(jobid)‘,它将检查表中的作业结果。
    • 如果找到结果,则返回结果,并从表中删除行。
    • 否则,它将返回空列表,或空列表,或返回您首选的返回值,以指示作业尚未完成。

有一些边缘的情况需要处理,所以一个现有的框架显然会更好,正如你说的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1748413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档