class Ractor::Port
Port-Objekte übertragen Nachrichten zwischen Ractors.
Öffentliche Klassenmethoden
Source
static VALUE
ractor_port_initialize(VALUE self)
{
return ractor_port_init(self, GET_RACTOR());
}
Gibt ein neues Ractor::Port-Objekt zurück.
Öffentliche Instanzmethoden
Source
# File ractor.rb, line 806 def close __builtin_cexpr! %q{ ractor_port_close(ec, self) } end
Schließt den Port. Das Senden an einen geschlossenen Port ist verboten. Der Empfang ist ebenfalls verboten, wenn sich keine Nachrichten in der Nachrichtenwarteschlange befinden.
Nur der Ractor, der den Port erstellt hat, darf ihn schließen.
port = Ractor::Port.new Ractor.new port do |port| port.close #=> closing port by other ractors is not allowed (Ractor::Error) end.join
Source
# File ractor.rb, line 817 def closed? __builtin_cexpr! %q{ ractor_port_closed_p(ec, self); } end
Gibt zurück, ob der Port geschlossen ist oder nicht.
Source
# File ractor.rb, line 826 def inspect "#<Ractor::Port to:\##{ __builtin_cexpr! "SIZET2NUM(rb_ractor_id((RACTOR_PORT_PTR(self)->r)))" } id:#{ __builtin_cexpr! "SIZET2NUM(ractor_port_id(RACTOR_PORT_PTR(self)))" }>" end
Source
# File ractor.rb, line 741 def receive __builtin_cexpr! %q{ ractor_port_receive(ec, self) } end
Empfängt eine Nachricht vom Port (die dort von Port#send gesendet wurde). Nur der Raktor, der den Port erstellt hat, kann Nachrichten auf diese Weise empfangen.
port = Ractor::Port.new r = Ractor.new port do |port| port.send('message1') end v1 = port.receive puts "Received: #{v1}" r.join # This will print: "Received: message1"
Die Methode blockiert den aktuellen Thread, wenn die Nachrichtenwarteschlange leer ist.
port = Ractor::Port.new r = Ractor.new port do |port| wait puts "Still not received" port.send('message1') wait puts "Still received only one" port.send('message2') end puts "Before first receive" v1 = port.receive puts "Received: #{v1}" v2 = port.receive puts "Received: #{v2}" r.join
Ausgabe
Before first receive Still not received Received: message1 Still received only one Received: message2
Wenn der Port geschlossen ist und keine weiteren Nachrichten in der Nachrichtenwarteschlange vorhanden sind, löst die Methode eine Ractor::ClosedError aus.
port = Ractor::Port.new port.close port.receive #=> raise Ractor::ClosedError
Source
# File ractor.rb, line 784 def send obj, move: false __builtin_cexpr! %q{ ractor_port_send(ec, self, obj, move) } end
Sendet eine Nachricht an den Port, die von port.receive akzeptiert werden soll.
port = Ractor::Port.new r = Ractor.new(port) do |port| port.send 'message' end value = port.receive puts "Received #{value}" # Prints: "Received: message"
Die Methode ist nicht blockierend (sie wird sofort zurückgegeben, auch wenn der Raktor, der den Port erstellt hat, noch nichts empfangen kann)
port = Ractor::Port.new r = Ractor.new(port) do |port| port.send 'test' puts "Sent successfully" # Prints: "Sent successfully" immediately end
Ein Versuch, an einen geschlossenen Port zu senden, löst eine Ractor::ClosedError aus.
r = Ractor.new {Ractor::Port.new} r.join p r # "#<Ractor:#6 (irb):23 terminated>" port = r.value port.send('test') # raise Ractor::ClosedError
Wenn das obj nicht teilbar ist, wird es standardmäßig durch Deep Cloning in den empfangenden Raktor kopiert.
Wenn das Objekt teilbar ist, wird eine Referenz auf das Objekt an den empfangenden Raktor gesendet.