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

时间:2016-04-08 10:11:01

标签: python google-app-engine

当我添加队列时,我给它一个唯一的名称,如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-*')的东西我会循环并删除?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

队列的优势(和限制)是他们使用FIFO(首先出现) - 不严格,有时会使用某些扩展名,例如&#34 ;延迟"任务的参数。但无论如何,任务调度程序/调度程序/协调程序不需要关心从队列中间删除任务,而是集中在队列头部有限数量的任务上工作。从这个专业化,我们获得了速度,成本效益和队列概念的可靠性。

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

  1. 将任务名称存储在某处,并使用它从队列中删除任务。
  2. 存储取消任务的意图(请求)。当任务击中工作人员时,您检查标志,如果需要,则忽略该任务。
  3. 当任务已分派给工作但尚未完成时,您可以将这两种方法的组合用于边缘情况。但在大多数情况下,这是不值得的。

    顺便说一下,许多消息排队系统没有"任务删除"一点都不正如俄罗斯的说法所说的那样#34;一句话不是鸟 - 如果它已经消失了你就不能把它放回去#34;。