GAE中使用python的延迟任务的任务队列

时间:2014-05-22 11:50:16

标签: python google-app-engine

如果以前问过这个问题,我很抱歉。我搜索了很多,在这里和那里找到了一些信息,但没有任何东西能完全帮助我。

我正在使用python在Google App引擎上构建一个应用程序,它允许用户上传一个文件,然后由一段python代码处理,然后生成的已处理文件将通过电子邮件发送回用户。

起初我为此使用了延期任务,效果很好。随着时间的推移,我逐渐意识到,由于在我遇到DeadlineExceededError之前处理的时间可能超过10分钟,我需要更加聪明。

因此,我开始研究任务队列,想要创建一个以块的形式处理文件的队列,然后在最后将所有内容拼凑在一起。

我目前制作单个延期任务的代码如下所示:

_=deferred.defer(transform_function,filename,from,to,email)

以便transform_function代码获取filename,from,to和email的值,并设置为进行处理。

有人可以告诉我如何将其变成一个接一个行动的线性任务链吗?我已经阅读了我可以考虑的关于Google应用引擎的所有文档,但遗憾的是,它们在实际代码方面没有详细编写。

我看到了诸如以下内容的引用:

taskqueue.add(url='/worker', params={'key': key})

但由于我没有为我的任务提供网址,而是在其他地方实施了transform_function(),我不知道这对我有什么影响......

非常感谢!

2 个答案:

答案 0 :(得分:0)

当你到达每个阶段的结束时,你可以继续调用deferred来运行你的任务。 其他队列只允许您控制调度和速率,但工作方式相同。

我跟踪任务中的已用时间,当我接近处理窗口的末尾时,代码会停止它正在执行的操作,并且会调用延迟链中的下一个任务或继续执行它停止的位置,具体取决于它是一个独立的设置步骤或继续工作的一大块。当任务只能运行60秒时,这些都被写回来了。

然而,您将面临的问题(如果它是正常的任务队列或延期并不重要)是每个阶段可能由于某种原因而失败,然后重新运行,因此每个阶段必须是幂等的。

对于长时间运行的链式任务,我在数据存储区中构建一个实体,该实体包含要完成的工作的描述并跟踪作业的处理状态,然后您可以继续重新运行相同的任务直到完成。完成后,它标志着工作完成。

答案 1 :(得分:0)

要避免10分钟超时,您可以将请求定向到后端或B类型模块 使用" _target" PARAM。

顺便说一下,您需要按顺序处理块的任何原因吗?如果您需要的是在完成所有块之后的一些通知(因此您可以"在最后将所有内容拼凑在一起") 您可以通过各种方式实现它(例如,每个块的延迟任务可以减少使用块数初始化的共享数据存储计数器[读取状态,减少并更新同一事务中的所有事务]。如果数据存储更新成功并且计数器已达到零,您可以继续将所有部分组合在一起。)使用延迟的替代方法可以简化建议的工作流程,可以是管道(https://code.google.com/p/appengine-pipeline/wiki/GettingStarted)。