Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax web应用程序任务的异步执行_Ajax_Asynchronous_Job Queue - Fatal编程技术网

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

Ajax web应用程序任务的异步执行,ajax,asynchronous,job-queue,Ajax,Asynchronous,Job Queue,我正在开发的web应用程序需要执行在http请求/响应周期中无法执行的任务。通常,用户将执行该请求,服务器将接受该请求,并运行一些脚本来生成数据(例如,使用povray渲染图像) 当然,这些任务可能需要很长时间,因此服务器不应该在向客户端发送响应之前挂起脚本以完成执行。因此,我需要异步执行脚本,并给客户端一个“资源在这里,但还没有准备好”,并可能告诉它一个ajax端点进行轮询,以便它可以在准备好时检索和显示资源 现在,我的问题与设计无关(尽管我也非常喜欢这方面的任何提示)。我的问题是:解决这个问

我正在开发的web应用程序需要执行在http请求/响应周期中无法执行的任务。通常,用户将执行该请求,服务器将接受该请求,并运行一些脚本来生成数据(例如,使用povray渲染图像)

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

现在,我的问题与设计无关(尽管我也非常喜欢这方面的任何提示)。我的问题是:解决这个问题的系统是否已经存在,所以我不会重新发明方轮?如果必须的话,我会使用一个进程队列管理器来提交任务,并放置一个HTTP端点来向ajax客户机显示状态,比如“挂起”、“中止”、“完成”,但是如果专门针对这个任务已经存在类似的东西,我会非常喜欢它

我在python+django中工作

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

问题是服务器如何处理很长任务的提交和排队。换句话说,我需要一个比让服务器提交脚本更好的系统。并不是说它不起作用,但我认为它有点太多了


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

您可以尝试两种方法:

  • 每隔n个间隔调用webserver,并通知作业id;服务器处理并返回有关该任务当前执行情况的一些信息
  • 要实现长时间运行的页面,每n个间隔发送数据;对于客户机,HTTP请求将“始终”处于“加载”状态,并且每次接收到新数据块时,它都需要收集新信息

关于第二种选择,你可以通过阅读了解更多;使用ASP.NET,您可以通过实现接口来做类似的事情。

您可以通过回复202 HTTP代码来表示正在“处理”资源:客户端必须稍后重试以获取完成的资源。根据具体情况,您可能必须发出“请求id”,以便将请求与响应相匹配


或者,您可以看看现有的COMET库,这些库可以满足您更多的“开箱即用”需求。不过,我不确定是否有符合您当前Django设计的系统。

我不知道有哪种系统可以做到这一点,但实现自己的系统是相当容易的:

  • 使用jobid、jobparameters和jobresult创建数据库表
    • jobresult是一个字符串,它将保存结果的pickle
    • jobparameters是输入参数的pickle列表
  • 当服务器开始处理作业时,它会在表中创建一个新行,然后SPWAN一个新进程来处理该行,并将作业ID传递给该进程
  • 任务处理程序进程完成后更新表中的jobresult
  • 网页(xmlrpc或您正在使用的任何内容)包含一个方法“getResult(jobid)”,该方法将检查表中的jobresult
    • 如果找到结果,则返回结果,并从表中删除该行
    • 否则,它将返回一个空列表,或无,或您首选的返回值,以表示作业尚未完成

有一些边缘情况需要处理,因此现有框架显然会比您所说的更好。

首先,您需要一些单独的“工作”服务,这些服务将在通电时单独启动,并通过一些本地IPC(如UNIX套接字(fast)或数据库(simple))与http请求处理程序通信


在处理请求的过程中,cgi请求工作状态或其他数据,并重播到客户端。

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

退房。它有许多语言(包括python)的库,并且相当流行。不确定是否有人有现成的方法可以轻松地将django连接到gearman和ajax调用,但自己完成这一部分并不复杂

基本思想是运行gearman作业服务器(或多个作业服务器),让web请求使用一些参数(如“{photo\u id:1234}”)将作业排队(如“resize\u photo”)。您将此作为后台任务排队。你要回把手。然后,ajax请求将轮询该句柄值,直到标记为完成

然后,您有一个单独的python进程工作者(或者可能有许多工作者)连接到此作业服务器,并为“resize_photo”作业注册自己,完成该工作,然后将其标记为完成


我还发现这在总结它的用法方面做得相当好。

对于您正在使用的python/django解决方案来说,这可能不是一个很好的答案,但我们使用Microsoft Message Queue处理类似的问题。它基本上是这样运行的

  • 网站更新某个数据库行,该行处于“处理”状态
  • 网站向MSMQ发送消息(这是一个非阻塞呼叫,因此它会立即将控制权返回给网站)
  • Windows服务(可能是任何程序)正在“监视”MSMQ并获取消息
  • Windows服务以“完成”状态更新数据库行
  • 无论如何,这就是它的要点。这对我们来说非常可靠,而且在规模和管理方面非常直接


    -al

    python和django的另一个好选择是