Список задач в очереди с помощью ActiveJob AsyncAdapter

#ruby-on-rails #queue #ruby-on-rails-5 #rails-activejob

#ruby-on-rails #очередь #ruby-on-rails-5 #rails-activejob

Вопрос:

Есть ли способ узнать, сколько (возможно, даже проверять каждое задание?) Заданий осталось в очереди?

Комментарии:

1. эй, дайте мне знать, сработало ли для вас приведенное ниже предложение, если вы уже пробовали его — мне любопытно, но у меня еще не было времени его протестировать 🙂 (может быть, в выходные)

2. То же самое здесь 🙂 Не удалось протестировать его сегодня. Посмотрим, смогу ли я добраться до этого завтра утром 😉

Ответ №1:

После некоторого изучения исходного кода вот что я обнаружил:

ActiveJob::QueueAdapters::AsyncAdapter использует параллельный пул потоков Ruby для планирования и выполнения заданий.

Когда вы инициализируете адаптер в своей конфигурации, вы передаете параметры исполнителя, которые, в свою очередь, являются аргументами initialize метода Concurrent::ThreadPoolExecutor класса.

Созданный экземпляр Concurrent::ThreadPoolExecutor класса имеет такие методы, как:

  • queue_length — Количество задач в очереди, ожидающих выполнения.
  • scheduled_task_count — Количество задач, которые были запланированы для выполнения в пуле с момента создания.

Тем не менее, я думаю, что что-то в этом роде должно сделать это за вас:

 ActiveJob::Base
  .queue_adapter
  .instance_variable_get(:@scheduler)
  .instance_variable_get(:@async_executor)
  .public_send(:queue_length)
 

Выше выполняется следующее:

  1. получите свой адаптер
  2. получите его instance_variable @scheduler , который указывает на
  3. экземпляр Concurrent::ThreadPoolExecutor (переменная экземпляра Scheduler класса — @async_executor )
  4. на котором вы можете фактически вызывать методы, описанные выше ( queue_length , scheduled_task_count и другие)

Хотя я его не тестировал, так что обязательно перепроверьте на наличие опечаток или чего-то еще.

Комментарии:

1. Хорошо, я только что попробовал. Похоже, это не работает. Он всегда возвращает 0.

2. @alexandernst подумайте об этом, он возвращает целое число, поэтому я почти уверен, что он работает в некотором смысле, что он вызывает правильный метод. Вы пробовали другие методы? Кроме того, вы уверены на 1000%, что он не должен возвращать 0?

3. Я попробовал это решение. Я пробовал queue_length , scheduled_task_count , completed_task_count . Все они всегда возвращаются 0

4. Получение async_executor адаптера возвращает экземпляр Concurrent::ThreadPoolExecutor . Проблема в том, что количество параллельных::ThreadPoolExecutor по какой-то причине не обновляется.