GAE 列出以名称开头的任务?

问题描述 投票:0回答:1

当我添加队列时,我给它一个唯一的名称,例如

longprocess-{id}-{timestamp}
。 ID 是数据库中该条目工作的 ID,时间戳确保队列中没有冲突的名称。

问题是用户可以根据需要停止/恢复长进程,因此在停止请求中,我想列出以

longporcess-1
开头的所有任务(对于 {id} = 1),并停止所有他们(预计 1 条条目)。

我可以通过以下方式确定任务目标:

q = taskqueue.Queue('longprocess')
q.delete_tasks(taskqueue.Task(name='longprocess-{0}'.format(longprocess.id,)))

但是当然,这不起作用,因为名称不正确(缺少

-{timestamp}
部分)。

有没有类似

q.search('longprocess-1-*')
的东西我会循环并删除?

python google-app-engine
1个回答
1
投票

不,不存在像

q.search('longprocess-1-*')
这样的东西,并且由于队列的性质,也不可能存在(技术上也不可能,但只是不合理)(原则上,否则它只是一个数据库表)。

队列的优点(和局限性)是它们使用 FIFO(先入先出)——不严格,有时带有一些扩展,例如任务的“延迟”参数。但无论如何,任务调度程序/调度程序/协调程序不需要关心从队列中间删除任务,而是专注于队列头部有限数量的任务。通过这种专业化,我们获得了队列概念的速度、成本效益和可靠性。

您的工作就是处理如何取消任务。您至少有 2 个选择:

  1. 在某处存储任务名称并使用它从队列中删除任务。
  2. 在某处存储取消任务的意图(请求)。当任务到达工作人员时,您检查标志,如果需要,只需忽略该任务。

当任务已分派给工作人员但尚未完成时,您可以结合使用这两种方法来处理边缘情况。但在大多数情况下,这并不值得付出努力。

顺便说一句,很多消息队列系统根本没有“任务删除”功能。正如俄罗斯谚语所说:“文字不是鸟 - 如果它消失了,你就无法将它放回去”。

© www.soinside.com 2019 - 2024. All rights reserved.