Python 每个实体的定期任务
我经常有一些模型是一些远程资源的本地副本,需要定期保持同步Python 每个实体的定期任务,python,google-app-engine,Python,Google App Engine,我经常有一些模型是一些远程资源的本地副本,需要定期保持同步 Task( url="/keep_in_sync", params={'entity_id':entity_id}, name="sync-%s" % entity_id, countdown=3600 ).add() 在“保持同步”中,任何更改都会保存到模型中,并计划稍后再次执行新任务 现在,虽然从表面上看这似乎是一个很好的解决方案,但实际上,如果所有必要的任务都真的添加了或没有添加,您可能会感到
Task(
url="/keep_in_sync",
params={'entity_id':entity_id},
name="sync-%s" % entity_id,
countdown=3600
).add()
在“保持同步”中,任何更改都会保存到模型中,并计划稍后再次执行新任务
现在,虽然从表面上看这似乎是一个很好的解决方案,但实际上,如果所有必要的任务都真的添加了或没有添加,您可能会感到担心。也许你的仓鼠笼子里有代表食物颗粒水平的实体,这样就可以自动发送电子邮件给你的管家喂它们。但几周后,当你度假回来时,你发现你的几只仓鼠正在挨饿
然后,创建一个贯穿每个实体的脚本,并确保正确的任务确实在队列中,这看起来是个好主意。但是任务类和队列类都没有任何方法来检查任务是否存在
你能拯救仓鼠并想出一个更好的方法来确保每个实体都定期调用一个方法吗
更新
看起来,如果你真的想确定任务是有计划的,你需要像尼克·约翰逊建议的那样跟踪你自己的任务。没有准备好放弃方便的任务队列,因此暂时只能容忍无法检查任务是否真的安排好的不确定性。如果队列中已经有这样的任务(相同的url和相同的参数),您将得到一个异常(taskalReadyExistError)。所以,别担心,只要把所有的数据都放到队列中,记住捕获异常
您可以在此处找到异常的完整列表:在单个任务中处理多个实体,而不是将每个实体的任务排队。例如,这可以由一个日常cron作业触发,该作业扇出到多个任务。除了确保为每个实体执行代码外,您还可以利用异步URLFetch更高效地与外部资源同步,并从数据存储中批量执行PUT和GET以提高更新效率。+1对于仓鼠隐喻:)这是一个非常有趣的想法,尤其是因为它可能会节省一些资源。如果有足够的实体,则可能没有足够的时间在单个cron作业处理程序中启动所有任务,因此不确定扇形展开将如何工作。您可以使用游标将其分为几个步骤,逐块进行