Tråde
Samtidig kørsel
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_sKaplø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 += 1er 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_sReturnering 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_sTrå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.joinHå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
endHvornå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.newstarter samtidig udførelse.joinventer;valueventer og returnerer et resultat.- Tråde deler hukommelse, hvilket kan føre til kapløbstilstande.
- En
Mutexmedsynchronizebeskytter 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.
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.