Trådar
Samtidig körning.
Trådar är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Vad är en tråd?
En tråd är en självständig exekveringsväg inuti ditt program. Ruby låter dig köra flera trådar så att arbete kan överlappa i tid.
- Huvudprogrammet körs i huvudtråden.
- Du skapar fler trådar med
Thread.new. - Trådar delar samma minne, så de kan läsa och skriva samma variabler.
Trådar passar utmärkt när programmet tillbringar tid med att vänta (på nätverk, disk eller sleep), eftersom en tråd kan vänta medan en annan fortsätter arbeta.
Skapa en tråd
Skicka med ett block till Thread.new. Blocket körs i en ny tråd. Anropa join för att vänta tills den är klar innan programmet avslutas.
t = Thread.new do
puts "Hello from the new thread"
end
t.join
puts "Main thread done"Varför join är viktigt
När huvudtråden avslutas stänger Ruby ner programmet och kanske inte väntar på andra trådar. join blockerar anroparen tills måltråden är klar.
Utan join kanske arbetstråden aldrig hinner skriva ut något innan programmet avslutas.
t = Thread.new do
sleep 0.1
puts "Worker finished"
end
puts "Waiting..."
t.join
puts "All done"Många trådar samtidigt
Du kan starta en grupp trådar, samla dem i en array och sedan anropa join på var och en. Det här är ett vanligt mönster för parallelliknande I/O-arbete.
threads = (1..3).map do |n|
Thread.new do
puts "Thread number " + n.to_s
end
end
threads.each(&:join)
puts "Finished all threads"Dela variabler
Trådar delar minne. En variabel som definieras innan tråden skapas är synlig i den. Det är kraftfullt, men också riskabelt om två trådar skriver samma värde.
counter = 0
t = Thread.new do
counter += 1
end
t.join
puts "Counter is " + counter.to_sRace conditions
En race condition uppstår när trådar växlar mellan uppdateringar av delade data och resultatet beror på tidpunkten.
counter += 1innebär egentligen läsa, addera och skriva.- Två trådar kan läsa samma gamla värde och båda skriva samma nya värde, så att en ökning går förlorad.
Lösningen är att samordna åtkomsten med ett lås.
Mutex: ett lås
En Mutex (ömsesidig uteslutning) ser till att bara en tråd åt gången kör den skyddade koden. Omslut den kritiska sektionen med 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_sReturnera ett värde
Thread#value väntar tills tråden är klar och returnerar värdet från dess block, ungefär som ett automatiskt join plus ett resultat.
t = Thread.new do
2 + 3
end
puts "Result is " + t.value.to_sTrådlokala variabler
Varje tråd kan lagra sina egna värden, åtkomliga via en symbol, med Thread.current[:key]. Dessa värden är privata för tråden och delas aldrig.
t = Thread.new do
Thread.current[:name] = "worker"
puts "Inside: " + Thread.current[:name]
end
t.joinHantera undantag
Om en tråd utlöser ett fel förblir det tyst tills du anropar join eller value, som utlöser felet igen. Om du anger Thread.abort_on_exception = true kraschar hela programmet omedelbart vid fel, vilket underlättar felsökning.
t = Thread.new do
raise "boom"
end
begin
t.join
rescue => e
puts "Caught: " + e.message
endNär trådar är användbara
Trådar är särskilt bra för I/O-bundet arbete där tiden går åt till att vänta. De hjälper mindre för CPU-bundet arbete på grund av GVL, som vi går igenom härnäst.
- Bra: ladda ner många URL:er och läsa många filer.
- Begränsad nytta: intensiv numerisk beräkning över flera kärnor.
Skydda alltid delat förändringsbart tillstånd med en Mutex.
Snabbtest
Testa dina kunskaper om trådar.
Sammanfattning: trådar
Du har lärt dig grunderna i Ruby-trådar:
Thread.newstartar samtidig körning.joinväntar;valueväntar och returnerar ett resultat.- Trådar delar minne, vilket kan orsaka race conditions.
- En
Mutexmedsynchronizeskyddar delat tillstånd. - Trådar är särskilt bra för I/O-bundet arbete.
Härnäst utforskar vi varför trådar inte kan använda flera CPU-kärnor fullt ut: GVL.
Lär dig Ruby med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 29
- Lektioner
- 109
Vanliga frågor
Är lektionen ”Trådar” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Trådar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Trådar”?
Samtidig körning. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?
Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Trådar”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Ruby Academy-lektionen?
Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.