如何使用 Google App Engine 任务队列按 (FIFO) 顺序执行任务?
How to execute tasks in (FIFO) order using Google App Engine Task Queues?
我相信 Google App Engine 中的任务队列(推送、拉取、延迟)不保证任务将按 FIFO 顺序执行。例如,假设我有一个包含任务 A、B 和 C 的任务队列,并且每个任务都有时间戳 t_A、t_B 和 t_C,这样 t_A < t_B < t_C。如何保证任务A、B、C按时间戳顺序执行?如果任务B失败了,我想延迟任务C的执行,直到任务B执行成功。我见过一个 ETA 字段来设置可以发送任务的最早时间,但这似乎更像是一种启发式方法,而不是保证。
考虑使用管道 API:
https://github.com/GoogleCloudPlatform/appengine-pipelines
他们已经为您完成了工作:
class LogWaitLogInOrder(pipeline.Pipeline):
def run(self, message1, message2, delay):
with pipeline.InOrder():
yield LogMessage(message1)
yield Delay(seconds=delay)
yield LogMessage(message2)
yield LogMessage('This would happen immediately on run')
管道 api 也给你 reporting/feedback/notification/etc。
但是如果这对您的特定需求来说太过分了,那么就按照@Paul 的建议去做,在第一个任务完成时创建下一个任务并希望最好的结果
视频参考:
Google I/O 2010 - Google App Engine 的数据管道:
我相信 Google App Engine 中的任务队列(推送、拉取、延迟)不保证任务将按 FIFO 顺序执行。例如,假设我有一个包含任务 A、B 和 C 的任务队列,并且每个任务都有时间戳 t_A、t_B 和 t_C,这样 t_A < t_B < t_C。如何保证任务A、B、C按时间戳顺序执行?如果任务B失败了,我想延迟任务C的执行,直到任务B执行成功。我见过一个 ETA 字段来设置可以发送任务的最早时间,但这似乎更像是一种启发式方法,而不是保证。
考虑使用管道 API:
https://github.com/GoogleCloudPlatform/appengine-pipelines
他们已经为您完成了工作:
class LogWaitLogInOrder(pipeline.Pipeline):
def run(self, message1, message2, delay):
with pipeline.InOrder():
yield LogMessage(message1)
yield Delay(seconds=delay)
yield LogMessage(message2)
yield LogMessage('This would happen immediately on run')
管道 api 也给你 reporting/feedback/notification/etc。
但是如果这对您的特定需求来说太过分了,那么就按照@Paul 的建议去做,在第一个任务完成时创建下一个任务并希望最好的结果
视频参考:
Google I/O 2010 - Google App Engine 的数据管道: