0Pricing
Ruby Academy · Lektion

Ractors

Echte Parallelität

Ractors ist eine kostenlose Ruby Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Ruby Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Ractor?

Ein Ractor (Ruby Actor) ist ein in Ruby 3 eingeführtes Nebenläufigkeitskonstrukt, das echte Parallelität ermöglicht. Jeder Ractor führt Ruby-Code unabhängig aus, sodass zwei Ractors gleichzeitig zwei CPU-Kerne nutzen können.

  • Ractors teilen keine veränderlichen Objekte, wodurch die Einschränkung der GVL umgangen wird.
  • Sie kommunizieren, indem sie Nachrichten senden.

Ractors sind noch experimentell, daher gibt Ruby bei ihrer Verwendung eine Warnung aus.

Einen Ractor erstellen

Erstellen Sie einen Ractor mit Ractor.new und einem Block. Der Block wird parallel ausgeführt. Verwenden Sie take, um den abschließenden Wert des Blocks abzurufen.

r = Ractor.new do
  2 + 3
end

puts r.take

Kein gemeinsam genutzter Zustand

Die wichtigste Regel lautet: Ractors können veränderliche Objekte nicht beliebig gemeinsam nutzen. Ein Ractor-Block übernimmt äußere lokale Variablen nicht auf dieselbe Weise wie ein gewöhnlicher Block. Sie müssen Daten ausdrücklich übergeben.

Diese Isolation macht die parallele Ausführung ohne Sperren sicher.

Argumente nach innen übergeben

Argumente für Ractor.new werden an die Blockparameter übergeben. Dies ist der sichere Weg, Daten an einen Ractor zu senden.

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

puts r.take

Nachrichten senden

Ractors verfügen über einen Nachrichteneingang. Senden Sie mit ractor.send(value) und empfangen Sie innerhalb des Blocks mit Ractor.receive.

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

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

Push und Pull

Zwei Kommunikationsrichtungen:

  • Push: mit send an einen Ractor senden und mit Ractor.receive lesen.
  • Pull: Ein Ractor gibt mit Ractor.yield einen Wert aus, außerhalb wird er mit take gelesen.

Zusammen ermöglichen diese Mechanismen, Ractors zu Pipelines zu verbinden.

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

puts r.take
puts r.take

Eingefrorene und gemeinsam nutzbare Objekte

Einige Objekte können zwischen Ractors gemeinsam genutzt werden, weil sie nicht verändert werden können: true, false, nil, Zahlen, Symbole und vollständig eingefrorene Objekte.

Ractor.make_shareable friert einen Objektgraphen ein, sodass er sicher gemeinsam genutzt werden kann.

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

Kopieren oder Verschieben

Wenn Sie ein nicht teilbares Objekt senden, erstellt Ractor standardmäßig eine tiefe Kopie, sodass jede Seite ihre eigene Kopie besitzt. Stattdessen können Sie es mit move verschieben: send(obj, move: true) überträgt den Besitz und macht das Original unbrauchbar.

Durch das Verschieben entfallen bei großen Objekten die Kosten des Kopierens.

Parallele Verarbeitung

Teilen Sie rechenintensive Aufgaben auf mehrere Ractors auf und sammeln Sie die Ergebnisse. Da jeder Ractor unabhängig ausgeführt wird, können Sie dadurch mehrere Prozessorkerne nutzen.

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

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

Ractors und Threads im Vergleich

Vergleich:

  • Threads teilen sich den Speicher und benötigen Sperren; Ractors sind isoliert und benötigen Nachrichten.
  • Threads parallelisieren keine CPU-intensive Ruby-Arbeit; Ractors schon.
  • Ractors sind strenger, wodurch viele Nebenläufigkeitsfehler verhindert werden.

Der Nachteil sind strengere Regeln für die gemeinsame Datennutzung.

Wann Sie Ractors verwenden sollten

Wählen Sie Ractors, wenn:

  • Sie CPU-bound-Aufgaben haben und mehrere Prozessorkerne in einem Prozess nutzen möchten.
  • Sie durch Isolation Fehler aufgrund gemeinsam genutzter Zustände vermeiden möchten.

Beachten Sie, dass Ractors experimentell sind: APIs können sich ändern, und viele Gems sind noch nicht Ractor-kompatibel.

Schnelltest

Testen Sie Ihr Verständnis von Ractors.

Zusammenfassung: Ractors

Sie haben die In-Prozess-Parallelisierung mit Ractors kennengelernt:

  • Ractor.new führt Code parallel aus; take ruft das Ergebnis ab.
  • Übergeben Sie Daten als Argumente oder mit send; empfangen Sie sie mit Ractor.receive.
  • Objekte werden kopiert oder verschoben, nicht beliebig gemeinsam genutzt.
  • Ractor.make_shareable friert Daten ein, damit sie sicher gemeinsam genutzt werden können.

Damit ist der Ruby-Concurrency-Kurs abgeschlossen: Threads, die GVL, Fibers und Ractors.

Häufig gestellte Fragen

Ist die Lektion „Ractors“ kostenlos?

Ja — der vollständige Text von „Ractors“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Ruby Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Ractors“?

Echte Parallelität Du übst Ruby Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Ruby Academy zu starten?

Keine Vorkenntnisse erforderlich. Ruby Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Ractors“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Ruby Academy-Lektion Code schreiben und ausführen?

Ja. Jede Ruby Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Threads
  2. Die GVL erklärt
  3. Fibers
  4. Ractors
← Zurück zu Ruby Academy