Есть ли способ увидеть, сколько (может быть, даже проверить каждое задание?) заданий осталось в очереди?
Получение списка задач в очереди с помощью ActiveJob AsyncAdapter
comment
эй, дайте мне знать, сработало ли для вас приведенное ниже предложение, если вы уже пробовали его - мне любопытно, но еще не было времени, чтобы проверить его :) (может быть, в выходные)
- person Andrey Deineko   schedule 14.10.2016
comment
То же самое :) Сегодня не удалось проверить. Посмотрим, смогу ли я добраться до этого завтра утром ;)
- person alexandernst   schedule 14.10.2016
Ответы (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
и другие)
Хотя я не проверял это, так что не забудьте дважды проверить на опечатки или что-то еще.
person
Andrey Deineko
schedule
13.10.2016
Хорошо, я только что попробовал. Кажется, это не работает. Он всегда возвращает 0.
- person alexandernst; 14.10.2016
@alexandernst подумайте об этом, он возвращает целое число, поэтому я почти уверен, что он работает в том смысле, что вызывает правильный метод. Вы пробовали другие методы? Кроме того, вы на 1000% уверены, что он не должен возвращать 0?
- person Andrey Deineko; 15.10.2016
Я попробовал это решение. Я пробовал
queue_length
, scheduled_task_count
, completed_task_count
. Все они всегда возвращают 0
- person mario199; 26.11.2018
Получение async_executor адаптера возвращает экземпляр Concurrent::ThreadPoolExecutor. Проблема в том, что счетчики Concurrent::ThreadPoolExecutor по какой-то причине не обновляются.
- person robertoplancarte; 08.06.2020