Google App Engine-任务队列-如果满足条件,如何运行任务

时间:2018-10-08 11:15:39

标签: python google-app-engine task-queue

我有简单的python代码,可在Google App Engine中创建和处理推送队列。

我要使用创建任务:

 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 :(得分:3)

您实际上没有其他明显不同的选择。

无法有条件地执行任务,只能由任务的ETA触发执行。因此,您唯一的选择是检查任务本身中的条件-就像您现在所做的那样-是否执行作业。但是到那时,该任务已经在运行。

计划执行任务后,要么:

  • 成功(如果处理程序返回200到299之间的代码),则退出队列。将任务排在队列中的唯一方法是RETRY_ANOTHER_TIME排队另一个任务(如果需要,可以克隆其本身)-第二个建议
  • 失败,在这种情况下,它保留在队列和retried中,但是根据任务重试策略配置,默认情况下它是一个渐进的退避方案。实际上,这是引发ValueError异常时所做的事情。也许更安静/更优雅的解决方案是简单地返回200-299“ OK”范围之外的代码,并根据您的需要调整重试策略。

我赞成第一种方法-只要您需要“如果IS_RAINING执行MY_FUNCION”,就继续排队和使用任务。它们很轻。

如果您需要“几乎在所有时间都执行IS_RAINING如果MY_FUNCION”并且IS_RAINING检查之间的间隔超过1分钟,则可以获取当前传递给参数的参数任务以其他方式 可能会更方便,使用cron作业而不是推送队列。很多ifs。