每个实体的定期任务

2024-04-28 09:59:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常有一些模型是一些远程资源的本地副本,需要定期保持同步。你知道吗

Task(
    url="/keep_in_sync", 
    params={'entity_id':entity_id}, 
    name="sync-%s" % entity_id,
    countdown=3600
).add()

在keep \u in \u sync中,任何更改都会保存到模型中,并计划稍后再次执行新任务。你知道吗

现在,虽然表面看来这是一个很好的解决方案,但实际上你可能会担心是否所有必要的任务都被添加了。也许你的仓鼠笼子里有代表食物颗粒水平的实体,这样就可以自动发送电子邮件给你的管家喂它们了。但几周后,当你度假回来时,你发现你的几只仓鼠正在挨饿。你知道吗

然后,创建一个贯穿每个实体的脚本,并确保正确的任务确实在队列中,这看起来是个好主意。但是任务类和队列类都没有任何方法来检查任务是否存在。你知道吗

你能拯救仓鼠并且想出一个更好的方法来确保一个方法确实被周期性地为每个实体调用吗?你知道吗

更新

似乎,如果你真的想确定任务是有计划的,你需要像尼克·约翰逊建议的那样跟踪你自己的任务。没有准备好放开方便的任务队列,因此暂时只能容忍无法检查任务是否真的安排好的不确定性。你知道吗


Tags: 方法in模型实体idtask远程队列
2条回答

在单个任务中处理多个实体,而不是将每个实体的任务排队。例如,这可以由一个日常cron作业触发,该作业可以分散到多个任务。除了确保为每个实体执行代码外,还可以利用异步URLFetch更有效地与外部资源同步,并从数据存储中批量放置和获取数据,以提高更新效率。你知道吗

如果队列中已经有这样的任务(相同的url和相同的参数),您将得到一个异常(TaskAlreadyExistsError)。所以,不用担心,只要把它们全部放到队列中,记住捕获异常。你知道吗

您可以在这里找到完整的异常列表:http://code.google.com/intl/en/appengine/docs/python/taskqueue/exceptions.html

相关问题 更多 >