如何使用GAE推送队列(任务)?

时间:2011-07-31 14:23:52

标签: google-app-engine task

我的GAE应用程序应该将多个文件上传到另一台服务器(使用urlfetch)。 如何使用tasks实现这一点,并假设在上一个任务完成时我应该再执行一次操作?

我如何知道上一个任务何时完成?

UPD 即可。以下方法与任务是否正确?

class Accumulator(db.Model):
    counter = db.IntegerProperty()

def increase_counter(key):
    obj = db.get(key)
    obj.counter += 1
    obj.put()

def zero_counter(key):
    obj = db.get(key)
    obj.counter = 0
    obj.put()

def decrease_counter(key):
    obj = db.get(key)
    obj.counter -= 1
    obj.put()

def get_counter(key):
    obj = db.get(key)
    return obj.counter

class PublishPhotosHandler(webapp.RequestHandler):
    # where this tasks_counter should be defined? seems not here
    db.run_in_transaction(zero_counter, some_unique_key)
    for argument in files_arguments:
        taskqueue.add(url='/upload', params={'key': key})
        db.run_in_transaction(increase_counter, some_unique_key)

    # here we redirect user to another page '/checkstatus'
    ...
    # nothing is shown to the user here

class UploadWorker(webapp.RequestHandler):
    def post(self):
        key = self.request.get('key')
        result = urlfetch.fetch(...)
        db.run_in_transaction(decrease_counter, some_unique_key)
        # how to return there error, so the task will be retried?
        # nothing is shown to the user here

# this is our '/checkstatus' page
class CheckStatus(webapp.RequestHandler):
    def get(self, key):
        if get_counter(some_unique_key) == 0:
            # all tasks finished
            # show the content

2 个答案:

答案 0 :(得分:1)

您可以创建一个计数器实体,该实体存储要执行的当前任务数。而且每项任务。完成后,必须减少此计数器的值,在交易中。如果它变为0,那么它就是最后一个动作,刚刚完成。

答案 1 :(得分:1)

您显示的代码无效 - 您启动的任务与计数器的本地范围不同,甚至可能不在同一台计算机上。您可以使用基于数据存储区的计数器,如@splix建议的那样,但这看起来像Pipeline library非常适合的情况。

相关问题