[RUBY] Ich habe versucht, mit Ractor mehrere Objekte übergeben zu können

Fazit

Ich habe versucht, den folgenden Code mit Ractor zum Laufen zu bringen.

r = Ractor.new do
    v1, v2 = Ractor.recv
    puts v1
    puts v2
    puts v1.class
    puts v2.class
end

r.send(1, 2)

r.take
# => 1
# => 2
# => Integer
# => Integer

Was ist Ractor?

Es ist ein Mechanismus zur Bereitstellung paralleler / paralleler Funktionen, die in Ruby3 eingeführt wurden. Ursprünglich Guild genannt, wird es seit mehreren Jahren diskutiert.

Weitere Details finden Sie im Video unten.

[JA] Ractor report / Koichi Sasada @ko1

Übergeben Sie das Objekt an Ractor

Sie können ein Objekt mit der Methode "send" an Ractor übergeben.

r = Ractor.new do
    v = Ractor.recv
    puts v
    puts v.class
end

r.send(1)

r.take
# => 1
# => Integer

Sie können jedoch nicht mehrere Objekte übergeben, wie unten gezeigt.

r = Ractor.new do
    v1, v2 = Ractor.recv
    puts v1
    puts v2
    puts v1.class
    puts v2.class
end

r.send(1, 2)

r.take
# =>wrong number of arguments (given 2, expected 1) (ArgumentError)

Es scheint jedoch in Ordnung zu sein, es als Array zu übergeben.

r = Ractor.new do
    v1, v2 = Ractor.recv
    puts v1
    puts v2
    puts v1.class
    puts v2.class
end

r.send([1, 2])

r.take
# => 1
# => 2
# => Integer
# => Integer

In der Implementierung sieht es so aus (in ractor.rb im CRuby-Quellcode) Die aktuelle "send" -Methode verwendet nur ein Objekt als Argument. Sie können auch angeben, ob mit dem Schlüsselwortargument "move" verschoben werden soll.

  def send obj, move: false
    __builtin_cexpr! %q{
      ractor_send(ec, RACTOR_PTR(self), obj, move)
    }
  end

Die C-Funktion wird mit __builtin_cexpr! Aufgerufen, und das von der Methode empfangene Argument wird unverändert an die C-Funktion übergeben. Abgesehen davon können Sie mit CRuby kürzlich Code schreiben, der Ruby-Variablen als interne Implementierung an C-Funktionen übergibt.

Was ich getan habe

Ich habe die Send-Methode von Ractor wie folgt umgeschrieben.

  def send obj, *arg, move: false
    obj = arg.unshift obj unless arg.empty?
    __builtin_cexpr! %q{
      ractor_send(ec, RACTOR_PTR(self), obj, move)
    }
  end

Erstens nimmt die "send" -Methode immer ein Objekt als Argument. Die Argumente werden als "obj, * arg, move: false" umgeschrieben, um dieses Verhalten beizubehalten. Wenn mehrere Objekte wie "send (1, 2)" übergeben werden, wird das Argument als Array an "* arg" übergeben.

Wenn arg kein leeres Array ist, werden mehrere Objekte übergeben, und das obj, das schließlich an die C-Funktion übergeben wird, wird in eine Zusammenführung des ersten Arguments und des Arguments variabler Länge konvertiert. Ich werde.

Sie müssen lediglich den geänderten CRuby-Quellcode erstellen.

Sie können jetzt mehrere Objekte wie folgt an Ractor übergeben:

r = Ractor.new do
    v1, v2 = Ractor.recv
    puts v1
    puts v2
    puts v1.class
    puts v2.class
end

r.send(1, 2)

r.take
# => 1
# => 2
# => Integer
# => Integer

Referenz

ref: Guild → Ractor ref: https://github.com/ko1/ruby/blob/ractor/ractor.ja.md ref: [[JA Ractor report / Koichi Sasada @ko1

Nachtrag

Übrigens, wenn Sie einen Affen-Patch möchten, können Sie eine Methode erstellen, die wie folgt verpackt ist.

class Ractor
    def multi_send(obj, *args, move: true)
        obj = args.unshift obj unless args.empty?
        send(obj, move: move)
    end 
end

r = Ractor.new do
    v1, v2 = Ractor.recv
    puts v1
    puts v2
    puts v1.class
    puts v2.class
end

r.multi_send(1, 2)

r.take

Da die Auswahl an Affenpflastern groß ist, ist es möglicherweise besser, "Verfeinerungen" zu verwenden, da dies weniger Auswirkungen hat, wenn Sie es in der Praxis verwenden.

module RefineRactor
    refine Ractor do
        def multi_send(obj, *args, move: true)
            obj = args.unshift obj unless args.empty?
            send(obj, move: move)
        end 
    end
end

using RefineRactor

r = Ractor.new do
    v1, v2 = Ractor.recv
    puts v1
    puts v2
    puts v1.class
    puts v2.class
end

r.multi_send(1, 2)

r.take

Recommended Posts

Ich habe versucht, mit Ractor mehrere Objekte übergeben zu können
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, AdoptOpenJDK 11 (11.0.2) mit dem Docker-Image zu überprüfen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Ich habe versucht, den Block mit Java zu brechen (1)
Ich möchte in der Lage sein, Dateien mit refile mit administrate [rails6] zu lesen.
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich habe versucht, mit Spring Data JPA zu beginnen
Ich habe versucht, Animationen mit der Blazor + Canvas-API zu zeichnen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Ich habe DI mit Ruby versucht
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Ich möchte in der Lage sein, Elemente zu übergeben, die mit regulären Ausdrücken validiert wurden, auch wenn sie leer bleiben
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
Ich habe versucht, yum-cron zu verifizieren
Ich habe versucht, mit Docker eine Padrino-Entwicklungsumgebung zu erstellen
Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich möchte in der Lage sein, selbst reguläre Ausdrücke zu denken und zu schreiben. ..
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, mit Eclipse + Tomcat eine http2-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine flexible ODER-Zuordnung mit MyBatis Dynamic SQL zu implementieren
Ich habe versucht, Ruby's Float (arg, Ausnahme: true) mit Builtin neu zu implementieren
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Ich habe versucht, C # (Indexer) zu kauen.
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe eine morphologische Analyse mit MeCab versucht
Ich habe versucht, die Unterstützung für iOS 14 zusammenzufassen
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe versucht, die Methode zu erklären
Ich habe GraphQL mit Spring Boot ausprobiert
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
C # (Polymorphismus: Polymorphismus)
Ich habe versucht, Slim mit Scaffold anzupassen
Ich habe versucht, Active Hash zu erklären
Ich habe versucht, die letzten 10 Fragen zu lösen, die nach der Registrierung bei AtCoder in Java gelöst werden sollten
Es wurde behoben, dass eine bestimmte Spalte mit aktivem Datensatz leer gespeichert werden konnte
[Java] Java soll in Ordnung sein, um Zeichenfolgen mit + zu verketten, also habe ich es überprüft