Ruby Academy · leksjon

Tråder

Samtidig kjøring

Leksjon 1 av 413 trinn

Tråder er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 1 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 en tråd?

En tråd er en uavhengig kjøringsbane inne i programmet. Ruby lar deg kjøre flere tråder slik at arbeid kan overlappe i tid.

  • Hovedprogrammet kjører i hovedtråden.
  • Du oppretter flere tråder med Thread.new.
  • Tråder deler samme minne, så de kan lese og skrive de samme variablene.

Tråder egner seg godt når programmet bruker tid på å vente (nettverk, disk eller sleep), fordi én tråd kan vente mens en annen fortsetter å arbeide.

Opprette en tråd

Send en blokk til Thread.new. Blokken kjører i en ny tråd. Kall join for å vente til den er ferdig før programmet avsluttes.

t = Thread.new do
  puts "Hello from the new thread"
end

t.join
puts "Main thread done"

Hvorfor join er viktig

Når hovedtråden avsluttes, avslutter Ruby programmet og vil kanskje ikke vente på andre tråder. join blokkerer den som kaller, til måltråden er ferdig.

Uten join kan arbeidertråden kanskje ikke rekke å skrive ut noe før programmet avsluttes.

t = Thread.new do
  sleep 0.1
  puts "Worker finished"
end

puts "Waiting..."
t.join
puts "All done"

Mange tråder samtidig

Du kan starte en gruppe tråder, samle dem i en tabell og deretter kalle join på hver av dem. Dette er et vanlig mønster for tilnærmet parallelt I/O-arbeid.

threads = (1..3).map do |n|
  Thread.new do
    puts "Thread number " + n.to_s
  end
end

threads.each(&:join)
puts "Finished all threads"

Dele variabler

Tråder deler minne. En variabel som er definert før tråden, er synlig inne i den. Dette er kraftig, men også farlig hvis to tråder skriver den samme verdien.

counter = 0

t = Thread.new do
  counter += 1
end

t.join
puts "Counter is " + counter.to_s

Kappløpstilstander

En kappløpstilstand oppstår når tråder fletter sammen oppdateringer av delte data, slik at resultatet avhenger av tidspunktet.

  • counter += 1 betyr egentlig les, legg til og skriv.
  • To tråder kan lese den samme gamle verdien og begge skrive den samme nye verdien, slik at én økning går tapt.

Løsningen er å samordne tilgangen med en lås.

Mutex: En lås

En Mutex (gjensidig utelukkelse) sørger for at bare én tråd om gangen kjører den beskyttede koden. Pakk den kritiske seksjonen inn i mutex.synchronize.

mutex = Mutex.new
counter = 0

threads = (1..5).map do
  Thread.new do
    mutex.synchronize do
      counter += 1
    end
  end
end

threads.each(&:join)
puts "Counter is " + counter.to_s

Returnere en verdi

Thread#value venter til tråden er ferdig og returnerer verdien fra blokken, omtrent som en automatisk join kombinert med et resultat.

t = Thread.new do
  2 + 3
end

puts "Result is " + t.value.to_s

Trådspesifikke variabler

Hver tråd kan lagre sine egne verdier med et symbol som nøkkel ved hjelp av Thread.current[:key]. Disse verdiene er private for tråden og deles aldri.

t = Thread.new do
  Thread.current[:name] = "worker"
  puts "Inside: " + Thread.current[:name]
end

t.join

Håndtere unntak

Hvis en tråd utløser en feil, forblir den stille til du kaller join eller value, som utløser feilen på nytt. Hvis du setter Thread.abort_on_exception = true, krasjer hele programmet umiddelbart ved feil, noe som gjør feilsøking enklere.

t = Thread.new do
  raise "boom"
end

begin
  t.join
rescue => e
  puts "Caught: " + e.message
end

Når tråder er nyttige

Tråder er særlig nyttige for I/O-bundet arbeid, der tiden går med til venting. De hjelper mindre for CPU-bundet arbeid på grunn av GVL, som vi går gjennom i neste del.

  • Godt egnet: laste ned mange URL-er og lese mange filer.
  • Begrenset nytte: omfattende tallberegninger på tvers av CPU-kjerner.

Beskytt alltid delt, foranderlig tilstand med en Mutex.

Kort kontroll

Test forståelsen din av tråder.

Oppsummering: Tråder

Du har lært det viktigste om Ruby-tråder:

  • Thread.new starter samtidig kjøring.
  • join venter, mens value venter og returnerer et resultat.
  • Tråder deler minne, noe som kan føre til kappløpstilstander.
  • En Mutex med synchronize beskytter delt tilstand.
  • Tråder egner seg svært godt til I/O-bundet arbeid.

Deretter skal vi se på hvorfor tråder ikke kan utnytte flere CPU-kjerner fullt ut: GVL.

Gratis å komme i gang

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 «Tråder» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «Tråder», 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 «Tråder»?

Samtidig kjøring 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 1 av 4.

Hvor lang tid tar leksjonen «Tråder»?

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.

Alle leksjonene i dette kurset

  1. Tråder
  2. GVL forklart
  3. Fibers
  4. Ractors
← Tilbake til Ruby Academy