GVL forklart
Hvorfor tråder er begrenset
GVL forklart er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Ruby Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Ruby Academy inneholder totalt 4 leksjoner.
Hva er GVL?
GVL (Global VM Lock, historisk kalt GIL) er en lås inne i CRuby, den standardiserte Ruby-tolkeren.
- Den tillater at bare én tråd kjører Ruby-kode om gangen.
- Den beskytter tolkens interne deler mot samtidig korrupsjon.
- Det betyr at CPU-arbeid i ren Ruby-kode ikke kjører virkelig parallelt på flere kjerner.
En forståelse av GVL forklarer når tråder er nyttige, og når de ikke er det.
Hvorfor finnes den?
De interne delene av CRuby (objektallokering, søppelrydding og C-utvidelser) ble ikke alle skrevet for å være trådsikre. GVL gjør dem sikre ved å serialisere Ruby-kjøringen.
Det er vanskelig å fjerne den på en ryddig måte, så CRuby beholder den. JRuby og TruffleRuby har ikke en GVL og kan kjøre tråder på mange kjerner.
CPU-bundet arbeid
For CPU-bundne oppgaver (matematikk, sortering og tolking) gir tråder ingen økt hastighet under CRuby. Bare én tråd kjører Ruby-kode til enhver tid, så to CPU-tråder tilsvarer omtrent én tråd pluss ekstra kostnader.
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 frigjør GVL
Det viktigste poenget er at blokkerende I/O frigjør GVL. Når en tråd sover, leser en fil eller venter på en socket, slipper den låsen slik at en annen tråd kan kjøre Ruby-kode.
Derfor er tråder godt egnet til I/O-bundet arbeid, selv med GVL.
Overlappende venting
Her sover tre tråder hver for seg. Fordi sleep frigjør GVL, overlapper ventetidene. Den totale tiden er omtrent 0,2 sekunder, ikke 0,6 sekunder.
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-utvidelser kan frigjøre den
Godt skrevne C-utvidelser kan frigjøre GVL under lange beregninger i innebygd kode ved hjelp av rb_thread_call_without_gvl. Da kan omfattende arbeid i innebygd kode kjøre parallelt mens Ruby-tråder fortsetter.
Noen biblioteker oppnår derfor ekte parallellitet selv på CRuby.
Tråder bytter fortsatt
Selv for CPU-arbeid fryser ikke GVL andre tråder for alltid. CRuby avbryter en tråd med jevne mellomrom, slik at alle får en tur. Arbeidet er samtidig (flettet), men ikke parallelt (samtidig utført).
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(", ")Samtidig kjøring kontra parallellitet
To viktige begreper:
- Samtidig kjøring: Oppgaver gjør fremgang ved å flettes sammen. Dette tillater GVL.
- Parallellitet: Oppgaver kjører nøyaktig samtidig på forskjellige kjerner. GVL forhindrer dette for Ruby-kode.
Tråder gir samtidig kjøring, mens Ractors gir parallellitet.
Omgå GVL
For å bruke flere kjerner til CPU-arbeid i CRuby kan du:
- Kjøre flere prosesser (hver prosess har sin egen GVL).
- Bruke Ractors for parallellitet i prosessen.
- Overlate arbeidet til C-utvidelser som frigjør GVL.
For I/O-arbeid er vanlige tråder som regel tilstrekkelig.
Prosesser har ingen delt GVL
Hver operativsystemprosess kjører sin egen Ruby-VM med sin egen GVL. Forgrening skaper ekte parallellitet, men prosesser deler ikke minne og bruker mer ressurser.
puts "Main pid: " + Process.pid.to_s
puts "Each forked process has its own independent GVL"Velge en strategi
Veiledning for valg:
- Mye venting? Bruk tråder.
- Tungt CPU-arbeid og behov for flere kjerner? Bruk prosesser eller Ractors.
- Behov for delt tilstand? Bruk tråder med en
Mutex, men ta hensyn til GVLs begrensninger.
Med kunnskap om GVL unngår du den klassiske feilen å forvente at CPU-tråder skalerer lineært.
Kort kontroll
Test forståelsen din av GVL.
Oppsummering: GVL
Det viktigste om Global VM Lock:
- Bare én tråd kjører Ruby-kode om gangen i CRuby.
- Den beskytter tolkens interne deler.
- Blokkerende I/O frigjør den, slik at venting kan overlappe.
- CPU-bundet Ruby-arbeid blir ikke parallelt på tvers av kjerner.
- Bruk prosesser eller Ractors for ekte parallellitet.
Deretter skal vi se på Fibers for lettvektsbasert samarbeidende samtidig kjøring.
Lær deg Ruby med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 29
- Leksjoner
- 109
Ofte stilte spørsmål
Er leksjonen «GVL forklart» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «GVL forklart», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Ruby Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «GVL forklart»?
Hvorfor tråder er begrenset Du øver på Ruby Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Ruby Academy?
Ingen tidligere erfaring er nødvendig. Ruby Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «GVL forklart»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Ruby Academy-leksjonen?
Ja. Alle Ruby Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.