7

我有几个工作人员正在使用 Sidekiq 运行并使用 Sidetiq 进行调度。我正在寻找有关在执行回调之前等待所有工作人员完成的最佳方法的建议,类似于 Sidekiq-Pro 的批处理功能。任何关于可能选项的建议将不胜感激!

4

3 回答 3

5

你可以写一个方法:

def wait_for_sidekiq
  sleep(1) until Sidekiq::Workers.new.size == 0 && Sidekiq::Queue.new.size == 0
end

我还建议您首先确保作业排队:

def wait_for_queuing
  sleep(1) until Sidekiq::Queue.new.size > 0 || Sidekiq::Workers.new.size > 0
end

这是必需的,因为有时第一个方法可能会在作业排队之前几毫秒执行,因此它根本不会等待。

于 2016-03-02T13:12:16.967 回答
3

对于简单的用例,您可以轮询统计信息以获取每个队列的待处理作业的计数。

因此,如果您知道所有作业都进入特定队列,并且没有其他作业从其他地方进入该队列,这就足够了。对于更高级/复杂的用例,您可以参考API 源

另一个简单的解决方案是使用基于Redis的计数器(因为您已经在使用 Redis)并从每个作业中原子地递减它,并在计数达到零时发布一个事件。

于 2015-04-29T20:26:36.773 回答
1

你应该看到这个Sidekiq-batch gem,我已经尝试过了,它就像 Sidekiq 的 Pro Batch 一样工作,而且它是免费的

希望这可以帮助

于 2017-04-06T02:44:09.787 回答