Ruby Academy · Lektion

Trådar

Samtidig körning.

Lektion 1 av 413 steg

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_s

Race conditions

En race condition uppstår när trådar växlar mellan uppdateringar av delade data och resultatet beror på tidpunkten.

  • counter += 1 innebä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_s

Returnera 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_s

Trå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.join

Hantera 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
end

Nä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.new startar samtidig körning.
  • join väntar; value väntar och returnerar ett resultat.
  • Trådar delar minne, vilket kan orsaka race conditions.
  • En Mutex med synchronize skyddar 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.

Gratis att börja

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.

Alla lektioner i den här kursen

  1. Trådar
  2. GVL förklarad
  3. Fibers
  4. Ractors
← Tillbaka till Ruby Academy