如何使用任务队列在Google App Engine中执行长请求

时间:2014-07-30 05:26:01

标签: google-app-engine python-2.7

我有一个功能需要很长时间才能从数据存储中删除许多实体。它会产生DeadlineExceed异常。我试图通过任务来运行它,但我仍然遇到麻烦。在文档中它说任务可以10分钟,但同时任务正在调用一个有自己限制的终点。因此,我没有看到任务的10分钟执行时间的好处。

超出截止日期的我的函数就是这样写的,它可以提取~1000个实体。

class DeleteJune(webapp.RequestHandler):
    def get(self):
        ji = Junk.all().run()
        for j in ji:
            db.delete(j)

如何运行这样的函数?

2 个答案:

答案 0 :(得分:1)

App Engine请求需要在60秒内响应,否则会出现DeadlineExceeded错误。相反,如果您通过任务队列发送请求,它将等待最多10分钟的响应。

任务队列用于命中url url处理程序应该运行脚本。因此,从一个请求,您通过任务队列将任务队列发送到另一个URL:

    from google.appengine.api import taskqueue
    taskqueue.Task(
        url='/your_DeleteJunk_class_url_handler',
        method='post',
        params={'what_to_delete': 'all'}
    ).add(queue_name='some-queue-name-or-default')

你需要2个url处理程序来执行此操作:一个调用脚本来设置任务队列,另一个调用taskqueue来完成工作。

答案 1 :(得分:1)

似乎你想删除所有东西,你可以使用mapreduce :)或者如你所提到的那样使用任务队列,诀窍是批处理删除更快(你的代码逐个删除)并链接任务。 / p>

class DeleteJune(webapp.RequestHandler):
    def get(self):
        ji = Junk.all(keys_only=True)
        if not ji.count(1):  # nothing to delete, task is done
            return
        db.delete(ji.run(limit=1000))
        // enqueue same task, or the hacky way just raise 500 here so it will retry :P

还没有真正测试过上面的代码,希望你理解逻辑。