Ruby Academy · Lektion

Tråde

Samtidig kørsel

Lektion 1 af 413 trin

Tråde er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Ruby Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ruby Academy-kurset indeholder 4 lektioner i alt.

Hvad er en tråd?

En tråd er en uafhængig udførelsessti i dit program. Ruby lader dig køre flere tråde, så arbejde kan overlappe tidsmæssigt.

  • Hovedprogrammet kører i hovedtråden.
  • Du opretter flere tråde med Thread.new.
  • Tråde deler den samme hukommelse, så de kan læse og skrive de samme variable.

Tråde er ideelle, når dit program bruger tid på at vente (netværk, disk, sleep), fordi én tråd kan vente, mens en anden fortsætter arbejdet.

Oprettelse af en tråd

Send en blok til Thread.new. Blokken kører i en ny tråd. Kald join for at vente på, at den afsluttes, før programmet afslutter.

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

t.join
puts "Main thread done"

Hvorfor join er vigtigt

Når hovedtråden afslutter, afslutter Ruby og venter muligvis ikke på andre tråde. join blokerer den kaldende tråd, indtil måltråden er færdig.

Uden join får arbejderen måske aldrig mulighed for at udskrive noget, før programmet afslutter.

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

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

Mange tråde på én gang

Du kan starte en gruppe tråde, samle dem i et array og derefter kalde join på hver enkelt. Det er et almindeligt mønster til I/O-arbejde, der minder om parallel udførelse.

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

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

Deling af variable

Tråde deler hukommelse. En variable, der er defineret før tråden, er synlig i den. Det er effektivt, men også farligt, hvis to tråde skriver den samme værdi.

counter = 0

t = Thread.new do
  counter += 1
end

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

Kapløbstilstande

En kapløbstilstand opstår, når tråde fletter opdateringer af delte data ind mellem hinanden, så resultatet afhænger af timingen.

  • counter += 1 er faktisk: læs, læg til, skriv.
  • To tråde kan læse den samme gamle værdi og begge skrive den samme nye værdi, så en forøgelse går tabt.

Løsningen er at koordinere adgangen med en lås.

Mutex: En lås

En Mutex (gensidig udelukkelse) sørger for, at kun én tråd ad gangen kører den beskyttede kode. Omslut den kritiske sektion 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

Returnering af en værdi

Thread#value venter på, at tråden afslutter, og returnerer værdien fra dens blok – som en automatisk join plus et resultat.

t = Thread.new do
  2 + 3
end

puts "Result is " + t.value.to_s

Trådlokale variable

Hver tråd kan gemme sine egne værdier med et symbol som nøgle ved hjælp af Thread.current[:key]. Værdierne er private for den pågældende tråd og deles aldrig.

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

t.join

Håndtering af undtagelser

Hvis en tråd udløser en fejl, forbliver den stille, indtil du kalder join eller value, som udløser den igen. Hvis du indstiller Thread.abort_on_exception = true, får fejl hele programmet til at gå ned med det samme, hvilket hjælper med fejlfinding.

t = Thread.new do
  raise "boom"
end

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

Hvornår tråde hjælper

Tråde er særligt gode til I/O-bundet arbejde, hvor tiden bruges på at vente. De hjælper mindre med CPU-bundet arbejde på grund af GVL, som gennemgås næste gang.

  • Godt: download af mange URL'er og læsning af mange filer.
  • Begrænset: tunge beregninger fordelt på flere kerner.

Beskyt altid delt, foranderlig tilstand med en Mutex.

Hurtigt tjek

Tjek din forståelse af tråde.

Opsamling: Tråde

Du har lært det grundlæggende om Ruby-tråde:

  • Thread.new starter samtidig udførelse.
  • join venter; value venter og returnerer et resultat.
  • Tråde deler hukommelse, hvilket kan føre til kapløbstilstande.
  • En Mutex med synchronize beskytter delt tilstand.
  • Tråde er særligt gode til I/O-bundet arbejde.

Dernæst undersøger vi, hvorfor tråde ikke kan udnytte flere CPU-kerner fuldt ud: GVL.

Gratis at komme i gang

Lær Ruby med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
29
Lektioner
109

Ofte stillede spørgsmål

Er lektionen “Tråde” gratis?

Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “Tråde”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Ruby Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Tråde”?

Samtidig kørsel Du øver dig i Ruby Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Ruby Academy?

Der kræves ingen tidligere erfaring. Ruby Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Tråde”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Ruby Academy-lektion?

Ja. Alle Ruby Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Tråde
  2. GVL forklaret
  3. Fibers
  4. Ractors
← Tilbage til Ruby Academy