python - Google App Engine - 任务队列 - 如何在满足条件时运行任务

标签 python google-app-engine task-queue

我有简单的Python代码,可以在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))

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

最佳答案

您实际上没有其他显着不同的替代方案。

无法有条件地执行任务,仅由任务的 ETA 触发执行。因此,您唯一的选择是检查任务本身内部的条件 - 就像您现在所做的那样 - 并执行或不执行该工作。但那时任务已经在运行了。

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

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

我喜欢第一种方法 - 只要您需要“如果 IS_RAINING 则执行 MY_FUNCION”,就继续排队和消耗任务。它们很轻。

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

关于python - Google App Engine - 任务队列 - 如何在满足条件时运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52701078/

相关文章:

python - 通过移动客户端在 Google App Engine 中使用 session

java - 用于第三方 servelet 的 Guice Singleton Servlet Binding 解决方法

python - GAE 中批量电子邮件的限制

google-app-engine - 配置 App Engine 任务队列时遇到问题

python - GAN 中的损失函数

python - 默认参数还是 kwargs?

python - Pandas 如何根据两列合并两个数据框并更新下一列?

python - OperationalError:接近 "%":Python 中的 sqlite3 语法错误

python - 将 Google App Engine 实体 key 传递到网页以维护上下文是否安全?

c++ - 在 C++ 中使用标准串行调度队列?