我正在使用deferred
将任务放入类似于this approach的AppEngine应用中的默认队列中。
我使用每5秒更改一次的时间戳命名任务。在此期间,对队列进行了大量调用,并使用相同的名称生成TaskAlreadyExistsError
,这很好。问题是当我检查配额时,“任务队列API调用”对于每次调用都在增加,而不仅仅是那些实际被放入队列的人。
我的意思是,如果您查看配额:Task Queue API Calls: 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呼叫的情况下检查任务是否已经存在?
答案 0 :(得分:2)
感谢您指出这种情况,因为我没有意识到,但同样的问题一定会影响到我。
据我所知,将一些东西放入由任务名组成的内存缓存中应该可以正常工作,然后如果你想减少内存缓存上的那些命中,你可以在实例中本地存储该标志。
答案 1 :(得分:0)
解决配额问题的“好方法”是消除对Task Queue API的目标失败调用。
_name
您每隔5秒使用一次更改,如果您提高任务队列的执行率,这可能不会成为瓶颈。但您也可以使用_countdown
添加任务。