在“使用Google App Engine的数据管道”中的视频/ PDF中,Brett将“now / 30”放入任务名称,并指出他稍后会解释原因,但不知怎的,他从未这样做过。 :)
http://www.youtube.com/watch?v=zSDC_TU7rtc#t=41m35
task_name = '%s-%d-%d' % (sum_name, int(now / 30), index)
你对这个原因有什么看法吗?它是否与7天无法重复使用任务名称有关?
答案 0 :(得分:3)
Brett Slatkin's own explanation
[布雷特]
嘿所有,
任务名称的int(time.time()/ 30)部分是为了防止队列停顿。当memcache被驱逐时,工作索引计数器将重置为零。这意味着新的fork-join工作项可能会插入与已插入的任务名称相同的任务。通过在任务名称中包含~30秒的时间窗口,我们确保此问题只能持续约30秒。这也是您在看到TombstonedTaskError异常时引发异常的原因。
最糟糕的情况是,如果时钟不稳定,则运行两个任务来执行扇入工作而不仅仅是一个,这在许多情况下是可接受的权衡,并且在使用任务队列API时是一个基本的可能性。这可以使用鸽子洞确认实体来缓解,就像我在物化视图示例中使用的那样。
希望有所帮助,
[/布雷特]