Ruby Academy · Lektion

Ractors

Ægte parallelitet

Lektion 4 af 413 trin

Ractors er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 4 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 Ractor?

En Ractor (Ruby-aktør) er en samtidighedsprimitiv, der blev introduceret i Ruby 3, og som giver ægte parallelisme. Hver Ractor kører Ruby-kode selvstændigt, så to Ractors kan bruge to CPU-kerner på samme tid.

  • Ractors deler ikke foranderlige objekter, hvilket omgår GVL's begrænsning.
  • De kommunikerer ved at sende meddelelser.

Ractors er stadig eksperimentelle, så Ruby udskriver en advarsel, når du bruger dem.

Oprettelse af en Ractor

Opret en med Ractor.new og en blok. Blokken kører parallelt. Brug take for at hente blokkens endelige værdi.

r = Ractor.new do
  2 + 3
end

puts r.take

Ingen delt tilstand

Den vigtigste regel er: Ractors kan ikke frit dele foranderlige objekter. En Ractor-blok indfanger ikke lokale variable fra det ydre område på den måde, en normal blok gør. Du skal sende data ind eksplicit.

Denne isolering gør parallel udførelse sikker uden låse.

Afsendelse af argumenter

Argumenter til Ractor.new leveres til blokkens parametre. Det er den sikre måde at sende data ind i en Ractor på.

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

puts r.take

Afsendelse af meddelelser

Ractors har en indbakke til meddelelser. Send med ractor.send(value), og modtag inde i blokken med Ractor.receive.

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

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

Skub versus hent

To kommunikationsretninger:

  • Skub: send til en Ractor, og læs med Ractor.receive.
  • Hent: En Ractor giver en værdi med Ractor.yield, og koden udenfor læser den med take.

Tilsammen lader de Ractors danne behandlingsforløb.

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

puts r.take
puts r.take

Fastfrosne og delbare objekter

Nogle objekter kan deles på tværs af Ractors, fordi de ikke kan ændres: true, false, nil, tal, symboler og objekter, der er dybt fastfrosne.

Ractor.make_shareable fastfryser en objektgraf, så den kan deles sikkert.

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

Kopiér eller flyt

Når du sender et objekt, der ikke kan deles, laver Ractor som standard en dyb kopi, så begge sider har deres egen kopi. Du kan i stedet flytte objektet med send(obj, move: true), hvilket overfører ejerskabet og gør originalen ubrugelig.

Flytning undgår kopieringsomkostningen for store objekter.

Parallelt arbejde

Opdel CPU-tungt arbejde mellem Ractors, og indsaml resultaterne. Fordi hver Ractor kører for sig selv, kan dette udnytte flere kerner.

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

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

Ractors og tråde

Sammenligning:

  • Tråde deler hukommelse og kræver låse, mens Ractors er isolerede og kræver meddelelser.
  • Tråde paralleliserer ikke Ruby-arbejde, der bruger CPU, mens Ractors gør.
  • Ractors er mere strikse, hvilket forhindrer mange fejl ved samtidighed.

Ulempen er mere faste regler for datadeling.

Hvornår du bør bruge Ractors

Vælg Ractors når:

  • Du har CPU-bundet arbejde og vil bruge flere kerner i én proces.
  • Du ønsker isolation for at undgå fejl på grund af delt tilstand.

Husk, at de er eksperimentelle. API'er kan ændre sig, og mange gems er endnu ikke kompatible med Ractors.

Hurtig test

Test din forståelse af Ractors.

Opsummering: Ractors

Du har lært parallelitet i samme proces med Ractors:

  • Ractor.new kører kode parallelt, og take henter resultatet.
  • Send data ind via argumenter eller send, og modtag dem med Ractor.receive.
  • Objekter kopieres eller flyttes i stedet for at blive delt frit.
  • Ractor.make_shareable gør data uforanderlige, så de kan deles sikkert.

Det afslutter kurset i Ruby-samtidighed: tråde, GVL, fibers og Ractors.

Gratis at komme i gang

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

Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “Ractors”, 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 “Ractors”?

Ægte parallelitet 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 4 af 4.

Hvor lang tid tager lektionen “Ractors”?

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.

Alle lektioner i dette kursus

  1. Tråde
  2. GVL forklaret
  3. Fibers
  4. Ractors
← Tilbage til Ruby Academy