我们说我向我的tasks-queue
添加了100个推送任务(作为第1组)。然后我将另外200个任务(作为组2)添加到同一队列。如何完成第1组的所有任务?
看起来QueueStatistics在这里无济于事。 tag
仅适用于拉队列。
我不能有单独的队列(因为我可能有数百个小组)。
答案 0 :(得分:0)
我可能会通过在数据存储区中使用分片计数器来解决它,例如@mgilson说并装饰我的延迟函数以在任务完成运行时运行回调。
如果你在https://cloud.google.com/appengine/articles/sharding_counters?hl=en包含代码并编写一个decriment函数来补充增量代码,我认为你正在寻找这样的东西。
import random
import time
from google.appengine.ext import deferred
def done_work():
logging.info('work done!')
def worker(callback=None):
def fst(f):
def snd(*args, **kwargs):
key = kwargs['shard_key']
del kwargs['shard_key']
retval = f(*args, **kwargs)
decriment(key)
if get_count(key) == 0:
callback()
return retval
return snd
return fst
def func(n):
# do some work
time.sleep(random.randint(1, 10) / 10.0)
logging.info('task #{:d}'.format(n))
def make_some_tasks():
func = worker(callback=done_work)(func)
key = random.randint(0, 1000)
for n in xrange(0, 100):
increment(key)
deferred.defer(func, n, shard_key=key)
答案 1 :(得分:0)
不保证任务只运行一次,偶尔也可以重复成功执行任务。这是一个例子:GAE deferred task retried due to "instance unavailable" despite having already succeeded。
因为这使用在任务入队时递增的计数器并且在任务完成时递减将不起作用 - 它将在这样的重复执行情况下递减两次,从而抛弃整个计算。
跟踪任务完成的唯一可靠方式(我能想到的)是独立跟踪每个单独排队的任务。您可以使用task names(在成功入队后指定或自动分配)执行此操作 - 它们对于给定队列是唯一的。例如,要跟踪的任务名称可以保留在数据存储区中持久存储的任务列表中。
注意:这只是我在问自己同样问题时得到的理论答案,我没有真正对它进行测试。