如何从芹菜任务中的不同队列中提取

How to pull from a different queue inside Celery task

我有一个任务队列,队列 A 和一个资源队列,队列 B。在程序启动时,队列 B 中放入的资源数量有限。如果任务能够提取资源,则它们可能会执行来自队列 B,一旦他们完成执行,他们必须将资源放回队列 B。

使用 Celery,有没有办法从一个任务中的不同队列中拉取来完成这个?或者这是否需要完全不同的架构?

另一种方法(尽管可能会降低并发性)是在将任务放入任务队列之前将任务与资源配对,然后轮询任务是否完成,并在完成时释放该资源并将其放回任务中与不同的任务排队。这是标准溶液吗?

我最终决定采用的架构在 Celery 中的 chain 原语的帮助下实现了这一点,并没有损失并发性。

为确保没有两个任务同时使用相同的资源,您可以在将任务添加到队列之前将所有任务分配给可用资源(假设您有 10 个任务和 3 个资源,只需分配 3 个任务到两个资源,4到第三个资源)。然后,对于每个资源,使用 chain() 调用任务,这会告诉 Celery 依次执行该资源的每个任务。