Tråder
Samtidig kjøring
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_sKappløpstilstander
En kappløpstilstand oppstår når tråder fletter sammen oppdateringer av delte data, slik at resultatet avhenger av tidspunktet.
counter += 1betyr 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_sReturnere 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_sTrå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.joinHå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
endNå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.newstarter samtidig kjøring.joinventer, mensvalueventer og returnerer et resultat.- Tråder deler minne, noe som kan føre til kappløpstilstander.
- En
Mutexmedsynchronizebeskytter 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.
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.