Ruby Academy · Lektion

Ractors

Verklig parallellism.

Lektion 4 av 413 steg

Ractors är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 4 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 Ractor?

En Ractor (Ruby Actor) är en mekanism för samtidighet som introducerades i Ruby 3 och ger verklig parallellism. Varje Ractor kör Ruby-kod självständigt, så två Ractors kan använda två CPU-kärnor samtidigt.

  • Ractors delar inte förändringsbara objekt, vilket kringgår GVL:s begränsning.
  • De kommunicerar genom att skicka meddelanden.

Ractors är fortfarande experimentella, så Ruby skriver ut en varning när du använder dem.

Skapa en Ractor

Skapa en med Ractor.new och ett block. Blocket körs parallellt. Använd take för att hämta blockets slutliga värde.

r = Ractor.new do
  2 + 3
end

puts r.take

Inget delat tillstånd

Den viktigaste regeln är att Ractors inte fritt kan dela förändringsbara objekt. Ett Ractor-block fångar inte yttre lokala variabler på samma sätt som ett vanligt block gör. Du måste skicka in data uttryckligen.

Det är denna isolering som gör parallell körning säker utan lås.

Skicka in argument

Argument till Ractor.new skickas till blockets parametrar. Det här är det säkra sättet att skicka data till en Ractor.

r = Ractor.new(10) do |x|
  x * x
end

puts r.take

Skicka meddelanden

Ractors har en inkorg för meddelanden. Skicka med ractor.send(value) och ta emot inuti blocket med Ractor.receive.

r = Ractor.new do
  msg = Ractor.receive
  "got: " + msg
end

r.send("hello")
puts r.take

Push kontra pull

Två kommunikationsriktningar:

  • Push: skicka in i en Ractor med send och läs med Ractor.receive.
  • Pull: en Ractor lämnar ett värde med Ractor.yield, och koden utanför läser det med take.

Tillsammans gör de att Ractors kan bilda pipelines.

r = Ractor.new do
  Ractor.yield 1
  Ractor.yield 2
end

puts r.take
puts r.take

Frysta och delbara objekt

Vissa objekt kan delas mellan Ractors eftersom de inte kan ändras: true, false, nil, tal, symboler och djupt frysta objekt.

Ractor.make_shareable fryser en objektgraf så att den kan delas säkert.

data = Ractor.make_shareable([1, 2, 3])
puts "Frozen? " + data.frozen?.to_s

Kopiera eller flytta

När du skickar ett objekt som inte kan delas gör Ractor som standard en djup kopia av det, så att varje sida får sitt eget. Du kan i stället flytta det med send(obj, move: true), vilket överför ägarskapet och gör originalet obrukbart.

Att flytta undviker kopieringskostnaden för stora objekt.

Parallellt arbete

Dela upp processorintensivt arbete mellan Ractors och samla in resultaten. Eftersom varje Ractor körs separat kan detta utnyttja flera kärnor.

ractors = (1..3).map do |n|
  Ractor.new(n) do |x|
    x * 100
  end
end

results = ractors.map(&:take)
puts "Results: " + results.join(", ")

Ractors jämfört med trådar

Jämförelse:

  • Trådar delar minne och behöver lås; Ractors är isolerade och behöver meddelanden.
  • Trådar kör inte Ruby-beräkningar parallellt; Ractors gör det.
  • Ractors är striktare, vilket förhindrar många samtidighetsbuggar.

Avvägningen är striktare regler för datadelning.

När du bör använda Ractors

Välj Ractors när:

  • Du har CPU-bundet arbete och vill använda flera kärnor i en enda process.
  • Du vill ha isolering för att undvika buggar som beror på delat tillstånd.

Tänk på att de är experimentella; API:er kan ändras och många gems är ännu inte kompatibla med Ractor.

Snabbkontroll

Testa din förståelse av Ractors.

Sammanfattning: Ractors

Du har lärt dig om parallellism i processen med Ractors:

  • Ractor.new kör kod parallellt; take hämtar resultatet.
  • Skicka in data via argument eller send; ta emot den med Ractor.receive.
  • Objekt kopieras eller flyttas, men delas inte fritt.
  • Ractor.make_shareable fryser data så att den kan delas säkert.

Detta avslutar kursen Ruby Concurrency: trådar, GVL, fibrer och Ractors.

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 ”Ractors” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Ractors”, 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 ”Ractors”?

Verklig parallellism. 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 4 av 4.

Hur lång tid tar lektionen ”Ractors”?

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