2011-09-08 46 views
2

我经常有一些模型是某些远程资源的本地副本,需要定期保持同步。每个实体的定期任务

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为仓鼠隐喻:) – Xion

回答

1

相反入队每个实体的任务的,在一个任务中处理多个实体。例如,这可以通过日常的cron作业触发,这可以解决多个任务。除了确保您为每个实体执行代码外,还可以利用异步URLFetch更有效地与外部资源同步,批量放入并从数据存储中获取以使更新更有效。

+0

这是一个非常有趣的想法,特别是因为它可能会节省一些资源。有了足够的实体,虽然可能没有足够的时间在单个cron作业处理程序中启动所有任务,但不知道如何扇出完全可行。 – Bemmu

+0

您可以通过使用光标逐块地将其分成几个步骤 –