Google App Engine - Очередь задач - Как запустить задачу, если выполняется условие - PullRequest
0 голосов
/ 08 октября 2018

У меня есть простой код Python, который создает и обрабатывает push-очереди в движке приложений Google.

Для создания задач я использую:

 taskqueue.Queue(MY_QUEUE_NAME).add(taskqueue.Task(url=MY_URL,params=MY_PARAMS))

Для обработки задач я использую:

class QueueHandler(webapp2.RequestHandler):
    def post(self):
        params = self.request.get('params')
        MY_FUNCION(params)

Это прекрасно работает, но мне нужно запускать свою функцию, только если выполняется условие!Я хотел бы сделать что-то вроде этого:

class QueueHandler(webapp2.RequestHandler):
    def post(self):
        params = self.request.get('params')
        if IS_RAINING:
            MY_FUNCION(params)
        ELSE:
            RETRY_ANOTHER_TIME

Прямо сейчас вместо RETRY_ANOTHER_TIME я использовал это:

raise ValueError("not_raining")

, но я знаю, что это очень плохой способ сделать это.

Я также предполагал, что вместо RETRY_ANOTHER_TIME я мог бы использовать:

taskqueue.Queue(MY_QUEUE_NAME).add(taskqueue.Task(url=MY_URL,params=MY_PARAMS))

создание другой задачи, которая будет пытаться сделать то же самое, но это медленно и ужасно для меня, учитывая, что я мог бы создать многодублирует бесполезные задания.

1 Ответ

0 голосов
/ 08 октября 2018

У вас действительно нет других существенно разных альтернатив.

Нет способа выполнить задачу условно, выполнение инициируется только ETA задачи.Таким образом, ваш единственный вариант - проверить состояние внутри самой задачи - так же, как вы это делаете сейчас - и выполнять работу или нет.Но к тому времени задача уже выполняется.

После того, как задача запланирована для запуска, она либо:

  • успешна (если обработчик возвращает код между 200 и 299) исняли с очереди.Единственный способ оставить задачу в очереди на RETRY_ANOTHER_TIME - поставить в очередь другую задачу (если хотите, клон самого себя) - ваше второе предложение
  • не удалось, в этом случае оно сохраняется в очереди, а retried , но в соответствии с конфигурацией политики повторения задачи, которая по умолчанию является схемой постепенного отката.Это фактически то, что вы сделали, когда вы подняли исключение ValueError.Возможно, более тихим / немного более изящным решением было бы просто вернуть код за пределами диапазона 200-299 «ОК» и настроить политику повторных попыток в соответствии с вашими потребностями.

Я предпочитаю 1-й подход -продолжайте ставить в очередь и потреблять задачи до тех пор, пока вам нужно "выполнить MY_FUNCION if IS_RAINING".Они довольно легкие.

Если вам нужно "выполнить MY_FUNCION if IS_RAINING" (al) почти все время, а интервал между проверками IS_RAINING превышает 1 минуту, и вы можете получить параметры, которыев настоящее время вы переходите к задаче другим способом: может удобнее использовать задание cron вместо очереди push.Много ifs.

...