#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)
Выше выполняется следующее:
- получите свой адаптер
- получите его instance_variable
@scheduler
, который указывает на - экземпляр
Concurrent::ThreadPoolExecutor
(переменная экземпляраScheduler
класса —@async_executor
) - на котором вы можете фактически вызывать методы, описанные выше (
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 по какой-то причине не обновляется.