如何从芹菜任务中的不同队列中提取
How to pull from a different queue inside Celery task
我有一个任务队列,队列 A 和一个资源队列,队列 B。在程序启动时,队列 B 中放入的资源数量有限。如果任务能够提取资源,则它们可能会执行来自队列 B,一旦他们完成执行,他们必须将资源放回队列 B。
使用 Celery,有没有办法从一个任务中的不同队列中拉取来完成这个?或者这是否需要完全不同的架构?
另一种方法(尽管可能会降低并发性)是在将任务放入任务队列之前将任务与资源配对,然后轮询任务是否完成,并在完成时释放该资源并将其放回任务中与不同的任务排队。这是标准溶液吗?
我最终决定采用的架构在 Celery 中的 chain
原语的帮助下实现了这一点,并没有损失并发性。
为确保没有两个任务同时使用相同的资源,您可以在将任务添加到队列之前将所有任务分配给可用资源(假设您有 10 个任务和 3 个资源,只需分配 3 个任务到两个资源,4到第三个资源)。然后,对于每个资源,使用 chain()
调用任务,这会告诉 Celery 依次执行该资源的每个任务。
我有一个任务队列,队列 A 和一个资源队列,队列 B。在程序启动时,队列 B 中放入的资源数量有限。如果任务能够提取资源,则它们可能会执行来自队列 B,一旦他们完成执行,他们必须将资源放回队列 B。
使用 Celery,有没有办法从一个任务中的不同队列中拉取来完成这个?或者这是否需要完全不同的架构?
另一种方法(尽管可能会降低并发性)是在将任务放入任务队列之前将任务与资源配对,然后轮询任务是否完成,并在完成时释放该资源并将其放回任务中与不同的任务排队。这是标准溶液吗?
我最终决定采用的架构在 Celery 中的 chain
原语的帮助下实现了这一点,并没有损失并发性。
为确保没有两个任务同时使用相同的资源,您可以在将任务添加到队列之前将所有任务分配给可用资源(假设您有 10 个任务和 3 个资源,只需分配 3 个任务到两个资源,4到第三个资源)。然后,对于每个资源,使用 chain()
调用任务,这会告诉 Celery 依次执行该资源的每个任务。