0Pricing
Ruby Academy · Lezione

Ractor

Vero parallelismo

Ractor è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.

Che cos'è un Ractor?

Un Ractor (Ruby Actor) è un costrutto di concorrenza introdotto in Ruby 3 che offre un vero parallelismo. Ogni Ractor esegue autonomamente il codice Ruby, quindi due Ractor possono utilizzare contemporaneamente due core della CPU.

  • I Ractor non condividono oggetti mutabili, aggirando così la limitazione del GVL.
  • Comunicano inviandosi messaggi.

I Ractor sono ancora sperimentali, quindi Ruby stampa un avviso quando li utilizza.

Creare un Ractor

Ne crei uno con Ractor.new e un blocco. Il blocco viene eseguito in parallelo. Usi take per ottenere il valore finale del blocco.

r = Ractor.new do
  2 + 3
end

puts r.take

Nessuno stato condiviso

La regola fondamentale è questa: i Ractor non possono condividere liberamente oggetti mutabili. Un blocco di Ractor non cattura le variabili locali esterne come farebbe un normale blocco. Deve passare i dati esplicitamente.

È questo isolamento a rendere sicura l'esecuzione parallela senza lock.

Passare argomenti all'interno

Gli argomenti di Ractor.new vengono passati ai parametri del blocco. Questo è il modo sicuro per inviare dati a un Ractor.

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

puts r.take

Inviare messaggi

I Ractor dispongono di una casella di posta per i messaggi. Invii messaggi con ractor.send(value) e li riceva all'interno del blocco con Ractor.receive.

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

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

Push e pull

Due direzioni di comunicazione:

  • Push: inviare dati con send a un Ractor e leggerli con Ractor.receive.
  • Pull: un Ractor produce dati con Ractor.yield e l'esterno li legge con take.

Insieme, questi meccanismi consentono ai Ractor di formare pipeline.

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

puts r.take
puts r.take

Oggetti congelati e condivisibili

Alcuni oggetti sono condivisibili tra Ractor perché non possono essere modificati: true, false, nil, numeri, simboli e oggetti congelati in profondità.

Ractor.make_shareable congela un grafo di oggetti, così può essere condiviso in sicurezza.

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

Copia o spostamento

Quando si invia un oggetto non condivisibile, Ractor ne crea per impostazione predefinita una copia profonda, così ciascun lato ne ha una propria. In alternativa, è possibile spostarlo con send(obj, move: true), trasferendone la proprietà e rendendo inutilizzabile l'originale.

Lo spostamento evita il costo della copia per gli oggetti di grandi dimensioni.

Lavoro parallelo

Suddivida il lavoro pesante per la CPU tra più Ractor e raccolga i risultati. Poiché ciascuno viene eseguito in autonomia, è possibile utilizzare più core.

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

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

Ractor e thread

Confronto:

  • I thread condividono la memoria e richiedono lock; i Ractor sono isolati e richiedono messaggi.
  • I thread non eseguono in parallelo il lavoro della CPU in Ruby; i Ractor sì.
  • I Ractor impongono regole più rigide, evitando così molti bug di concorrenza.

Il compromesso consiste in regole più rigide per la condivisione dei dati.

Quando usare Ractor

Scelga Ractor quando:

  • Ha attività vincolate dalla CPU e vuole utilizzare più core in un unico processo.
  • Vuole l'isolamento per evitare bug dovuti allo stato condiviso.

Ricordi che sono sperimentali: le API possono cambiare e molte gem non sono ancora compatibili con Ractor.

Verifica rapida

Verifichi la comprensione dei Ractor.

Riepilogo: Ractor

Ha appreso il parallelismo all'interno del processo con i Ractor:

  • Ractor.new esegue il codice in parallelo; take ne recupera il risultato.
  • Passi i dati tramite argomenti o send; li riceva con Ractor.receive.
  • Gli oggetti vengono copiati o spostati, non condivisi liberamente.
  • Ractor.make_shareable rende i dati immutabili per condividerli in sicurezza.

In questo modo completa il corso sulla concorrenza in Ruby: thread, GVL, fiber e Ractor.

Domande Frequenti

La lezione «Ractor» è gratuita?

Sì — il testo completo di «Ractor» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.

Cosa imparerò in «Ractor»?

Vero parallelismo Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Ruby Academy?

Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Ractor»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Ruby Academy?

Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Thread
  2. Il GVL spiegato
  3. Fiber
  4. Ractor
← Torna a Ruby Academy