微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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在总结它的用法方面做得很好.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐