Buat daftar tugas yang diantrekan dengan ActiveJob AsyncAdapter

Apakah ada cara agar saya dapat melihat berapa banyak (bahkan mungkin memeriksa setiap pekerjaan?) pekerjaan yang tersisa dalam antrian?


person alexandernst    schedule 13.10.2016    source sumber
comment
hai, beri tahu saya apakah saran di bawah ini berhasil untuk Anda jika Anda sudah mencobanya - Saya agak penasaran tetapi belum punya waktu untuk mengujinya :) (mungkin selama akhir pekan)   -  person Andrey Deineko    schedule 14.10.2016
comment
Sama di sini :) Tidak dapat mengujinya hari ini. Biarkan saya melihat apakah saya bisa melakukannya besok pagi;)   -  person alexandernst    schedule 14.10.2016


Jawaban (1)


Setelah menggali lebih dalam kode sumber inilah yang saya temukan:

ActiveJob::QueueAdapters::AsyncAdapter menggunakan kumpulan thread Ruby serentak untuk menjadwalkan dan melaksanakan pekerjaan.

Saat Anda menginisialisasi adaptor dalam konfigurasi Anda, Anda meneruskan opsi eksekutor, yang kemudian menjadi argumen ke metode initialize dari Concurrent::ThreadPoolExecutor.

Instance kelas Concurrent::ThreadPoolExecutor yang dibuat memiliki metode seperti:

  • queue_length - Jumlah tugas di antrian menunggu eksekusi.
  • scheduled_task_count - Jumlah tugas yang dimiliki telah dijadwalkan untuk dieksekusi di kolam sejak konstruksi.

Oleh karena itu, menurut saya sesuatu seperti ini akan bermanfaat bagi Anda:

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

Di atas melakukan hal berikut:

  1. ambil adaptor Anda
  2. dapatkan instance_variable @scheduler , itu menunjuk ke
  3. contoh Concurrent::ThreadPoolExecutor (variabel contoh kelas Scheduler - @async_executor)
  4. di mana Anda sebenarnya dapat memanggil metode yang dijelaskan di atas (queue_length, scheduled_task_count dan lainnya)

Meskipun saya tidak mengujinya, jadi pastikan untuk memeriksa ulang apakah ada kesalahan ketik atau apa pun.

person Andrey Deineko    schedule 13.10.2016
comment
Oke, saya baru saja mencoba. Tampaknya tidak berhasil. Ia selalu mengembalikan 0. - person alexandernst; 14.10.2016
comment
@alexandernst pikirkanlah, ia mengembalikan bilangan bulat, jadi saya cukup yakin itu berfungsi dalam arti tertentu, ia memanggil metode yang benar. Apakah Anda mencoba metode lain? Juga, apakah Anda 1000% yakin, itu tidak akan menghasilkan 0? - person Andrey Deineko; 15.10.2016
comment
Saya mencoba solusi ini. Saya mencoba queue_length, scheduled_task_count, completed_task_count. Semuanya selalu kembali 0 - person mario199; 26.11.2018
comment
Mendapatkan async_executor adaptor akan mengembalikan instance Concurrent::ThreadPoolExecutor. Masalahnya adalah jumlah Concurrent::ThreadPoolExecutor tidak diperbarui karena beberapa alasan. - person robertoplancarte; 08.06.2020