Как использовать push-очереди (задачи) с GAE? - PullRequest
1 голос
/ 31 июля 2011

Мое приложение GAE должно загрузить несколько файлов на другой сервер (с использованием urlfetch).Как реализовать это с помощью заданий с предположением, что в конце завершения последнего задания я должен выполнить еще одно действие?

Как узнать, когда завершено последнее задание?

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 ]

1 голос
/ 01 августа 2011

Код, который вы показываете, не будет работать - задачи, которые вы запускаете, не находятся в той же локальной области, что и счетчик, и могут даже не быть на той же машине. Вы можете использовать счетчик на основе хранилища данных, как подсказывает @splix, но это выглядит как случай, когда идеально подойдет Библиотека конвейеров .

1 голос
/ 31 июля 2011

Вы можете создать объект counter , который хранит текущее количество задач для выполнения.И каждая задача.после окончания, должно уменьшиться значение этого счетчика в транзакции.Если он становится 0, то это последнее действие, только что законченное.

...