如何中止公牛队列中的特定任务?

Posted

技术标签:

【中文标题】如何中止公牛队列中的特定任务?【英文标题】:How to abort a particular task in bull queue? 【发布时间】:2018-05-13 02:00:23 【问题描述】:

根据这个包https://github.com/OptimalBits/bull 是否有可能中止“等待队列”中的某个任务? 我的用例如下:

我有一个 mongodb 集合“用户”和一个集合“友谊”,我在其中存储两个用户的名称和头像。所以我只需要一个查询来获取某个用户的好友列表。当用户更改他的头像时,我必须在“友谊”集合中更新此用户中的所有文档。这是一个性能不重要的操作,因为我希望它在后台执行,并且一致性对于这个用例并不重要。但是当用户在短时间内多次更新他的头像时,我想取消所有引用旧任务(用于更新友谊集合),除了最新的。这与公牛可能吗?

提前致谢,我将不胜感激。

【问题讨论】:

【参考方案1】:

查看 Bull 参考资料,您会发现有一个 Job.remove() 方法。由于您尚未发布任何代码,我只能猜测它的外观。因此,我已经描述了您可以做什么。

但是,您要做的是将Promise<Job> 存储在Queue.add() 将返回的Map<string, Map<string, Promise<Job>> 中。字符串将是您的用户的_idPromise<Job>[] 是包含特定用户的所有排队作业的数组。一旦 Job 已解决(您可以使用 Job.finished() 等待已解决的作业),您需要从 Map 中删除 Promise。

每当用户更改他的头像时,如果您需要删除任何工作,您都可以查看您的地图。上面提到的 Map 中的 value 是另一个 Map(key 是一个字符串,代表JobId),它可以很容易地让你通过 JobId 删除 Jobs。这听起来可能有点复杂,但不要害怕 - 如果您了解地图的工作原理,那应该不是问题 :-)。

【讨论】:

@kentor 你能回答这个问题***.com/questions/56256609/… 吗?

以上是关于如何中止公牛队列中的特定任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何将定期任务发送到 Celery 中的特定队列

用于队列和 api 的嵌套公牛单独进程

超时后如何中止 multiprocessing.Pool 中的任务?

公牛队列:通过在jobId中使用部分时间戳确保时间段内的唯一作业

节点公牛队列错误:缺少作业类型 JOB_NAME 的进程处理程序

如何在windows窗体应用程序c#中中止当前任务