【问题标题】:Google App Engine - Task Queue - How to run a task if a condition is metGoogle App Engine - 任务队列 - 如果满足条件,如何运行任务
【发布时间】:2019-03-13 01:18:26
【问题描述】:

我有简单的 python 代码,可以在谷歌应用引擎中创建和处理推送队列。

要创建我使用的任务:

 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))

创建另一个任务来尝试相同的事情,但这对我来说既慢又糟糕,考虑到这样我可以创建许多重复的无用任务。

【问题讨论】:

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


【解决方案1】:

你真的没有其他明显不同的选择。

没有办法有条件地执行任务,执行只能由任务的 ETA 触发。因此,您唯一的选择是检查任务本身内部的条件 - 就像您现在所做的一样 - 是否完成这项工作。但到那时,任务已经在运行了。

一旦计划运行任务,它是:

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

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

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

【讨论】:

  • 我完全理解你所说的一切,但关于返回 200-299 范围之外的代码的部分。我的意思是,我不是程序员,这可能是一个非常愚蠢的问题,但我怎样才能编写代码来返回您所说的值?我应该写:“返回 300”因为 raise ValueError 代码的缺点是显示在谷歌应用引擎的 Stackdriver 错误报告页面中,我只是想避免这种情况
  • 尝试使用self.abort(<the_code>) 而不是raise ... 语句。见webapp2.readthedocs.io/en/latest/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2011-08-19
  • 2019-02-24
  • 2011-06-24
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多