我经常使用的模型是某些远程资源的本地副本,需要定期保持同步。
Task(
url="/keep_in_sync",
params={'entity_id':entity_id},
name="sync-%s" % entity_id,
countdown=3600
).add()
在keep_in_sync内部,任何更改都会保存到模型中,并且计划在以后再次发生新任务。
现在,虽然表面上看起来这是一个很好的解决方案,但实际上如果真的添加了所有必要的任务,你可能会担心。也许你有实体代表仓鼠笼内食物颗粒的水平,这样就可以将自动发送的电子邮件发送给你的管家来喂它们。但几个星期后,当你从假期回来时,你会发现你的几只仓鼠正在挨饿。
然后开始看起来像一个好主意,制作一个遍历每个实体的脚本,并确保正确的任务确实在队列中。但是Task和Queue类都没有任何方法来检查任务是否存在。
你可以保存仓鼠并提出一种更好的方法来确保每个实体定期调用一种方法吗?
更新
似乎如果你想确定任务的安排,你需要跟踪自己的任务,正如尼克约翰逊建议的那样。还没准备好放开方便的任务队列,所以暂时只能容忍无法检查任务是否真正安排的不确定性。
答案 0 :(得分:1)
如果队列中已存在此类任务(相同的URL和相同的参数),您将获得异常(TaskAlreadyExistsError)。所以,不要担心,只是将它们全部排入队列,并记住捕获异常。
您可以在此处找到完整的例外列表:http://code.google.com/intl/en/appengine/docs/python/taskqueue/exceptions.html
答案 1 :(得分:1)
不是在每个实体中排队任务,而是在单个任务中处理多个实体。例如,这可以由每日cron作业触发,该作业可以进行多项任务。除了确保为每个实体执行代码之外,您还可以利用异步URLFetch更有效地与外部资源同步,并从数据存储区批量放置和获取更新效率。