2010-07-27 25 views
1

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

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

Любая помощь была бы оценена :)

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

+0

Не можете ли вы изменить свой картограф, чтобы он не сработал? Альтернативно, используйте что-то другое, кроме mapreduce, так как структура mapreduce строится вокруг предположения, что вы хотите надежно обновлять каждый соответствующий объект. –

+0

Hey Nick, Я использую urlfetch в mapper для получения некоторой информации, поэтому всегда есть шанс получить таймаут. Если я могу получить информацию, я установил флаг, и наоборот, если выборка завершится с ошибкой. Так что картограф действительно делает именно то, что я хочу, чтобы он делал, и я вполне доволен этим. Единственная проблема - это действительно очередь задач, которая затем продолжает повторять неудачные выборки. – herrherr

+0

Дополнение (поскольку я не могу отредактировать свой прежний комментарий): То, что вы предлагаете, на самом деле именно то, что я пытаюсь сделать, я пытаюсь обработать таймаут не как сбой, а действительный ответ для выполняемой задачи. – herrherr

ответ

1

В обработчике задач это сделать

 

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 
 

Надеется, что это помогает !!

+0

Вы также можете выбросить исключение 'deferred.PermanentTaskFailure', которое предотвратит повторную попытку appengine и сообщит об исключении в консоли. –

Смежные вопросы