De GVL uitgelegd
Waarom threads beperkt zijn
De GVL uitgelegd is een gratis Ruby Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Ruby Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Ruby Academy bevat in totaal 4 lessen.
Wat is de GVL?
De GVL (globale VM-vergrendeling, historisch de GIL) is een vergrendeling binnen CRuby, de standaard Ruby-interpreter.
- Hierdoor kan er steeds maar één thread tegelijk Ruby-code uitvoeren.
- De interne werking van de interpreter wordt beschermd tegen gelijktijdige beschadiging.
- Dit betekent dat CPU-werk in pure Ruby niet echt parallel op meerdere kernen wordt uitgevoerd.
Als je de GVL begrijpt, weet je wanneer threads helpen en wanneer niet.
Waarom deze bestaat
De interne onderdelen van CRuby (objecttoewijzing, geheugenopruiming en C-extensies) zijn niet allemaal threadveilig geschreven. De GVL maakt ze veilig door Ruby-uitvoering te serialiseren.
Het is lastig om de GVL op een nette manier te verwijderen, daarom houdt CRuby deze. JRuby en TruffleRuby hebben geen GVL en kunnen threads op meerdere kernen uitvoeren.
CPU-gebonden werk
Voor CPU-gebonden taken (wiskunde, sorteren en parseren) versnellen threads niets onder CRuby. Er draait op elk moment maar één thread Ruby-code, dus twee CPU-threads komen ruwweg neer op één thread plus extra kosten.
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 geeft de GVL vrij
De kern is: blokkerende I/O geeft de GVL vrij. Wanneer een thread slaapt, een bestand leest of op een socket wacht, laat deze de vergrendeling los zodat een andere thread Ruby kan uitvoeren.
Daarom zijn threads uitstekend voor I/O-gebonden werk, zelfs met de GVL.
Overlappende wachttijden
Hier slapen drie threads elk. Omdat sleep de GVL vrijgeeft, overlappen de wachttijden. De totale tijd is ongeveer 0,2 s, niet 0,6 s.
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_sC-extensies kunnen deze vrijgeven
Goed geschreven C-extensies kunnen de GVL vrijgeven tijdens lange berekeningen in systeemeigen code met behulp van rb_thread_call_without_gvl. Hierdoor kan zwaar systeemeigen werk parallel worden uitgevoerd terwijl Ruby-threads doorgaan.
Sommige bibliotheken bereiken zo echte parallelle uitvoering, zelfs op CRuby.
Threads wisselen nog steeds
Zelfs bij CPU-werk bevriest de GVL andere threads niet voor altijd. CRuby onderbreekt een thread periodiek, zodat elke thread aan de beurt komt. Het werk is gelijktijdig (door elkaar heen uitgevoerd), maar niet parallel (op hetzelfde moment).
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(", ")Gelijktijdigheid versus parallellisme
Twee belangrijke woorden:
- Gelijktijdigheid: taken boeken voortgang door elkaar heen uit te voeren. De GVL maakt dit mogelijk.
- Parallellisme: taken worden exact op hetzelfde moment op verschillende kernen uitgevoerd. De GVL verhindert dit voor Ruby-code.
Met threads krijg je gelijktijdigheid; met Ractors krijg je parallellisme.
De GVL omzeilen
Om in CRuby meerdere kernen te gebruiken voor CPU-werk kun je:
- Meerdere processen uitvoeren (elk heeft een eigen GVL).
- Ractors gebruiken voor parallellisme binnen één proces.
- Werk uitbesteden aan C-extensies die de GVL vrijgeven.
Voor I/O-werk zijn gewone threads meestal voldoende.
Processen delen geen GVL
Elk besturingssysteemproces voert zijn eigen Ruby-VM uit met zijn eigen GVL. Forken zorgt voor echt parallellisme, maar processen delen geen geheugen en gebruiken meer hulpbronnen.
puts "Main pid: " + Process.pid.to_s
puts "Each forked process has its own independent GVL"Een strategie kiezen
Keuzehulp:
- Veel wachten? Gebruik threads.
- Zware CPU-belasting en kernen benutten? Gebruik processen of Ractors.
- Gedeelde toestand nodig? Gebruik threads met een
Mutex, maar houd rekening met de beperkingen van de GVL.
Als je de GVL kent, voorkom je de klassieke fout om te verwachten dat CPU-threads lineair opschalen.
Kennischeck
Toets je begrip van de GVL.
Samenvatting: de GVL
Belangrijkste punten over de globale VM-vergrendeling:
- In CRuby voert steeds maar één thread Ruby-code uit.
- De interne werking van de interpreter wordt beschermd.
- Blokkerende I/O geeft de vergrendeling vrij, waardoor overlappende wachttijden mogelijk zijn.
- CPU-gebonden Ruby-werk wordt niet parallel uitgevoerd over meerdere kernen.
- Gebruik processen of Ractors voor echt parallellisme.
Vervolgens kijken we naar Fibers voor lichte coöperatieve gelijktijdigheid.
Leer Ruby met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 29
- Lessen
- 109
Veelgestelde vragen
Is de les “De GVL uitgelegd” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Ruby Academy, waaronder “De GVL uitgelegd”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Ruby Academy bevat in totaal 4 lessen.
Wat leer ik in “De GVL uitgelegd”?
Waarom threads beperkt zijn Je oefent met Ruby Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Ruby Academy te beginnen?
Ervaring vooraf is niet nodig. Ruby Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “De GVL uitgelegd”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Ruby Academy?
Ja. Elke les over Ruby Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.