AppEngine任务队列API调用在TaskAlreadyExistsError时增加
我在使用 deferred
来把任务放到 AppEngine 应用的默认队列,类似于这种方法。
我给任务起的名字是一个每5秒就会变化的时间戳。在这段时间内,很多请求都用相同的名字放到队列里,这就导致出现了 TaskAlreadyExistsError
的错误,这个我觉得没问题。问题是,当我查看配额时,“任务队列 API 调用”的次数在每次请求时都在增加,而不仅仅是那些真正放进队列的请求。
比如说,如果你看配额:任务队列 API 调用: 34,017 of 100,000
,再对比一下实际的队列调用:/_ah/queue/deferred - 2.49K
这是处理队列的代码:
try:
deferred.defer(function_call, params, _name=task_name, _countdown=int(interval/2))
except (taskqueue.TaskAlreadyExistsError, taskqueue.TombstonedTaskError):
pass
我想这就是它的工作原理。有没有好的办法来解决配额的问题?我可以用 memcache 来存储 task_name
并检查任务是否已经添加,除了上面的 try/catch 之外?或者有没有办法在不使用任务队列 API 调用的情况下检查任务是否已经存在?
2 个回答
0
解决配额问题的“好方法”就是避免那些注定会失败的任务调用到任务队列API。
你使用的_name
每5秒就会变化一次,如果你提高任务队列的执行速度,这可能不会成为瓶颈。但是你还在使用_countdown
来添加任务。
2
谢谢你指出这一点,因为我之前没意识到,但我也遇到了同样的问题。
从我所看到的情况来看,把任务名称放进memcache应该没问题。如果你想减少对memcache的访问次数,你也可以在实例内部把这个标志存储在本地。