ajax – Web应用程序的任务异步执行

我正在开发的Web应用程序需要执行在http请求/响应周期中执行太长而无法执行的任务.通常,用户将执行请求,服务器将接受此请求,并且除其他外,运行一些脚本以生成数据(例如,使用povray渲染图像).

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

现在,我的问题与设计无关(尽管我非常喜欢这方面的任何提示).我的问题是:解决这个问题的系统是否已经存在,所以我不重新发明方形轮?如果必须的话,我会使用进程队列管理器来提交任务并放置一个HTTP端点来发送状态,例如“pending”,“aborted”,“completed”到ajax客户端,但是如果已经类似了专门为这项任务而存在,我会非常喜欢它.

我在python django工作.

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

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

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

解决方法

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

查看gearman.它有很多语言的库(包括python),并且相当受欢迎.不确定是否有任何开箱即用的方法可以轻松地将django连接到gearman和ajax调用,但是自己做这部分并不是很复杂.

基本的想法是你运行gearman作业服务器(或多个作业服务器),让你的web请求排队一个工作(如’resize_photo’)与一些参数(如'{photo_id:1234}’).您将此作为后台任务排队.你得到一个回头.然后,您的ajax请求将对该句柄值进行轮询,直到它被标记为完成.

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

我还发现这个blog post在总结它的用法方面做得很好.

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...