我有简单的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))
创建另一个将尝试相同操作的任务,但是考虑到这种方式,我可能会创建很多重复的无用任务,这对我来说太慢且令人厌烦。
答案 0 :(得分:3)
您实际上没有其他明显不同的选择。
无法有条件地执行任务,只能由任务的ETA触发执行。因此,您唯一的选择是检查任务本身中的条件-就像您现在所做的那样-是否执行作业。但是到那时,该任务已经在运行。
计划执行任务后,要么:
ValueError
异常时所做的事情。也许更安静/更优雅的解决方案是简单地返回200-299“ OK”范围之外的代码,并根据您的需要调整重试策略。我赞成第一种方法-只要您需要“如果IS_RAINING执行MY_FUNCION”,就继续排队和使用任务。它们很轻。
如果您需要“几乎在所有时间都执行IS_RAINING如果MY_FUNCION”并且IS_RAINING
检查之间的间隔超过1分钟,则可以获取当前传递给参数的参数任务以其他方式 可能会更方便,使用cron作业而不是推送队列。很多ifs。