Penjelasan GVL
Mengapa thread terbatas.
Penjelasan GVL adalah pelajaran Ruby Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Ruby Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Ruby Academy mencakup 4 pelajaran total.
Apa Itu GVL
GVL (Penguncian VM Global, yang secara historis disebut GIL) adalah pengunci di dalam CRuby, yaitu interpreter Ruby standar.
- GVL hanya mengizinkan satu utas menjalankan kode Ruby pada satu waktu.
- GVL melindungi bagian internal interpreter dari kerusakan akibat eksekusi konkuren.
- GVL berarti pekerjaan CPU dengan Ruby murni tidak benar-benar berjalan secara paralel pada banyak inti.
Memahami GVL menjelaskan kapan utas membantu dan kapan tidak.
Mengapa GVL Ada
Bagian internal CRuby (alokasi objek, pengumpulan sampah, dan ekstensi C) tidak semuanya ditulis agar aman untuk utas. GVL membuatnya aman dengan menjalankan eksekusi Ruby secara berseri.
Menghapusnya dengan cara yang bersih sulit dilakukan, sehingga CRuby tetap menggunakannya. JRuby dan TruffleRuby tidak memiliki GVL dan dapat menjalankan utas pada banyak inti.
Pekerjaan yang Bergantung pada CPU
Untuk tugas yang bergantung pada CPU (matematika, pengurutan, penguraian), utas tidak mempercepat pekerjaan di bawah CRuby. Hanya satu utas yang menjalankan kode Ruby pada suatu saat, sehingga dua utas CPU kurang lebih setara dengan satu utas ditambah beban tambahan.
def heavy
sum = 0
1_000_00.times { |i| sum += i }
sum
end
puts heavy
puts "CPU work does not parallelize under the GVL"I/O Melepaskan GVL
Inti pentingnya adalah: I/O yang memblokir melepaskan GVL. Ketika sebuah utas tidur, membaca berkas, atau menunggu soket, utas tersebut melepaskan pengunci sehingga utas lain dapat menjalankan Ruby.
Inilah alasan utas sangat baik untuk pekerjaan yang bergantung pada I/O, bahkan saat menggunakan GVL.
Waktu Tunggu yang Tumpang Tindih
Di sini tiga utas masing-masing tidur. Karena sleep melepaskan GVL, waktu tunggunya dapat berlangsung tumpang tindih. Total waktunya sekitar 0,2 detik, bukan 0,6 detik.
start = Time.now
threads = (1..3).map do
Thread.new { sleep 0.2 }
end
threads.each(&:join)
elapsed = Time.now - start
puts "Elapsed roughly: " + elapsed.round(1).to_sEkstensi C Dapat Melepaskannya
Ekstensi C yang ditulis dengan baik dapat melepaskan GVL selama perhitungan native yang panjang menggunakan rb_thread_call_without_gvl. Hal ini memungkinkan pekerjaan native yang berat berjalan secara paralel sementara utas Ruby terus berjalan.
Jadi, beberapa pustaka dapat mencapai paralelisme yang sebenarnya bahkan di CRuby.
Utas Tetap Berganti
Bahkan untuk pekerjaan CPU, GVL tidak membekukan utas lain selamanya. CRuby secara berkala menghentikan sementara sebuah utas agar setiap utas mendapat giliran. Pekerjaan tersebut bersifat konkuren (diselingi), tetapi tidak paralel (berlangsung secara bersamaan).
results = []
mutex = Mutex.new
threads = (1..3).map do |n|
Thread.new do
mutex.synchronize { results << n }
end
end
threads.each(&:join)
puts "Collected: " + results.sort.join(", ")Konkurensi vs Paralelisme
Dua istilah penting:
- Konkurensi: tugas mengalami kemajuan dengan cara saling menyelingi. GVL memungkinkan hal ini.
- Paralelisme: tugas berjalan tepat pada saat yang sama di inti yang berbeda. GVL mencegah hal ini untuk kode Ruby.
Utas memberi Anda konkurensi; Ractor memberi Anda paralelisme.
Mengatasi GVL
Untuk menggunakan beberapa inti dalam pekerjaan CPU di CRuby, Anda dapat:
- Menjalankan beberapa proses (masing-masing memiliki GVL sendiri).
- Menggunakan Ractor untuk paralelisme di dalam proses.
- Menyerahkan pekerjaan kepada ekstensi C yang melepaskan GVL.
Untuk pekerjaan I/O, utas biasa biasanya sudah cukup.
Proses Tidak Berbagi GVL
Setiap proses OS menjalankan VM Ruby-nya sendiri dengan GVL-nya sendiri. Membuat proses turunan menghasilkan paralelisme yang sebenarnya, tetapi proses tidak berbagi memori dan menggunakan lebih banyak sumber daya.
puts "Main pid: " + Process.pid.to_s
puts "Each forked process has its own independent GVL"Memilih Strategi
Panduan memilih:
- Banyak waktu menunggu? Gunakan utas.
- CPU berat dan ingin memanfaatkan banyak inti? Gunakan proses atau Ractor.
- Perlu status bersama? Gunakan utas dengan
Mutex, tetapi perhatikan keterbatasan GVL.
Memahami GVL mencegah kesalahan klasik berupa mengharapkan utas CPU bertambah kinerjanya secara linear.
Pemeriksaan Singkat
Uji pemahaman Anda tentang GVL.
Rangkuman: GVL
Hal-hal penting tentang Penguncian VM Global:
- Hanya satu utas yang menjalankan kode Ruby pada satu waktu di CRuby.
- GVL melindungi bagian internal interpreter.
- I/O yang memblokir melepaskan GVL sehingga waktu tunggu dapat berlangsung tumpang tindih.
- Pekerjaan Ruby yang bergantung pada CPU tidak berjalan secara paralel di banyak inti.
- Gunakan proses atau Ractor untuk paralelisme yang sebenarnya.
Selanjutnya kita akan membahas fiber untuk konkurensi kooperatif yang ringan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penjelasan GVL” gratis?
Ya — teks lengkap “Penjelasan GVL” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Ruby Academy, upgrade ke CoddyKit PRO. Kursus Ruby Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penjelasan GVL”?
Mengapa thread terbatas. Kamu berlatih Ruby Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Ruby Academy?
Tidak diperlukan pengalaman sebelumnya. Ruby Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Penjelasan GVL” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Ruby Academy ini?
Ya. Setiap pelajaran Ruby Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.