App Engine — количество повторных попыток очереди задач с Mapper API

вот что я пытаюсь сделать: я настроил задание MapReduce с новым API Mapper. Это в основном работает нормально. Проблема в том, что Task Queue повторяет все невыполненные задачи. Но на самом деле я не хочу, чтобы он это делал. Есть ли способ удалить задачу из очереди или сообщить ей, что задача выполнена успешно? Возможно, передать код состояния 200?

Я знаю, что могу получить X-Appengine-Taskretrycount, но на самом деле это не помогает, так как я не знаю, как остановить задачу. Я попытался использовать «проход» в блоке try..except, но это тоже не сработало.

Любая помощь приветствуется :)

Спасибо, Крис


person herrherr    schedule 27.07.2010    source источник
comment
Разве вы не можете изменить свой картограф, чтобы он не давал сбоев? В качестве альтернативы используйте что-то другое, кроме mapreduce, поскольку инфраструктура mapreduce построена на предположении, что вы хотите надежно обновлять каждый соответствующий объект.   -  person Nick Johnson    schedule 27.07.2010
comment
Привет, Ник, я использую urfetch в картографе для получения некоторой информации, так что всегда есть шанс получить тайм-аут. Если я могу получить информацию, я устанавливаю флаг, и наоборот, если выборка не удалась. Таким образом, картограф делает именно то, что я от него хочу, и меня это вполне устраивает. Единственная проблема на самом деле заключается в очереди задач, которая затем продолжает повторять неудачные выборки.   -  person herrherr    schedule 27.07.2010
comment
Дополнение (поскольку я не могу редактировать свой прежний комментарий): то, что вы предлагаете, на самом деле именно то, что я пытаюсь сделать, я пытаюсь рассматривать тайм-аут не как сбой, а как допустимый ответ для выполняемой задачи.   -  person herrherr    schedule 27.07.2010
comment
ключевое слово pass в python ничего не делает. это всего лишь заполнитель синтаксиса для строки, где ожидается код, но вы не хотите ничего делать, например, try: # какой-то код, кроме: pass Если у вас нет слова pass, интерпретатор будет ожидать, что код будет под ним и с отступом, которого на самом деле не будет, и он вызовет исключение, которое вам не нужно.   -  person jpswain    schedule 29.12.2010


Ответы (2)


В вашем обработчике задач сделайте это


class yourTaskWorker(webapp.RequestHandler):
    def post(self):
        logging.info('yourTaskWorker (post)...')        
        if int(self.request.headers['X-Appengine-Taskretrycount']) == 0:
            logging.info('running task...')
            # call whatever functions you want here
        else:
            logging.info('this task failed before, not going to retry.')
            # obviously call nothing here, the task will "pass" without error and go away

Надеюсь это поможет!!

person jpswain    schedule 28.12.2010
comment
Вы также можете создать исключение deferred.PermanentTaskFailure, которое предотвратит повторную попытку appengine и сообщит об исключении в консоли. - person Matt Lyons; 01.07.2011

По состоянию на http://code.google.com/p/appengine-mapreduce/source/detail?r=114 изменение, объект контекста имеет атрибут task_retry_count.

person mikea    schedule 29.09.2010