我有一个功能需要很长时间才能从数据存储中删除许多实体。它会产生DeadlineExceed异常。我试图通过任务来运行它,但我仍然遇到麻烦。在文档中它说任务可以10分钟,但同时任务正在调用一个有自己限制的终点。因此,我没有看到任务的10分钟执行时间的好处。
超出截止日期的我的函数就是这样写的,它可以提取~1000个实体。
class DeleteJune(webapp.RequestHandler):
def get(self):
ji = Junk.all().run()
for j in ji:
db.delete(j)
如何运行这样的函数?
答案 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
还没有真正测试过上面的代码,希望你理解逻辑。