2

在来自“使用 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 天期限有关吗?

链接到会话页面

4

1 回答 1

3

布雷特·斯拉特金自己的解释

[布雷特]
大家好,

任务名称的 int(time.time()/30) 部分是为了防止队列停顿。当 memcache 被驱逐时,工作索引计数器将重置为零。这意味着新的 fork-join 工作项可能会插入与已插入的任务名称相同的任务。通过在任务名称中包含约 30 秒的时间窗口,我们确保此问题只能持续约 30 秒。这也是当您看到 TombstonedTaskError 异常时应该引发异常的原因。

如果时钟不稳定,最坏的情况是运行两个任务来完成扇入工作,而不是只运行一个,这在许多情况下是可以接受的权衡,也是使用任务队列 API 时的基本可能性。这可以使用鸽洞确认实体来缓解,就像我在物化视图示例中使用的那样。

希望有帮助,
[/Brett]

于 2010-06-07T21:27:26.130 回答