Class: Ractor::Port
Relationships & Source Files | |
Inherits: | Object |
Defined in: | ractor_sync.c, ractor.rb |
Class Method Summary
- .new constructor
Instance Attribute Summary
-
#closed? ⇒ Boolean
readonly
Return the port is closed or not.
Instance Method Summary
-
#<<(obj, move: false)
Alias for #send.
-
#close
Close the port.
- #initialize_copy(orig)
- #inspect ⇒ String
-
#receive ⇒ msg
Receive a message to the port (which was sent there by #send).
-
#send(msg, move: false) ⇒ self
(also: #<<)
Send a message to a port to be accepted by port.receive.
Constructor Details
.new
[ GitHub ]# File 'ractor_sync.c', line 93
static VALUE ractor_port_initialzie(VALUE self) { return ractor_port_init(self, GET_RACTOR()); }
Instance Attribute Details
#closed? ⇒ Boolean
(readonly)
Return the port is closed or not.
# File 'ractor.rb', line 753
def closed? __builtin_cexpr! %q{ ractor_port_closed_p(ec, self); } end
Instance Method Details
#<<(obj, move: false)
Alias for #send.
# File 'ractor.rb', line 714
alias << send
#close
Close the port. On the closed port, sending is not prohibited. Receiving is also not allowed if there is no sent messages arrived before closing.
port = Ractor::Port.new
Ractor.new port do |port|
port.sned 1 # OK
port.send 2 # OK
port.close
port.send 3 # raise Ractor::ClosedError
end
port.receive #=> 1
port.receive #=> 2
port.receive #=> raise Ractor::ClosedError
Now, only a ::Ractor
which creates the port is allowed to close ports.
port = Ractor::Port.new
Ractor.new port do |port|
port.close #=> closing port by other ractors is not allowed (Ractor::Error)
end.join
# File 'ractor.rb', line 742
def close __builtin_cexpr! %q{ ractor_port_close(ec, self) } end
#initialize_copy(orig)
[ GitHub ]# File 'ractor_sync.c', line 99
static VALUE ractor_port_initialzie_copy(VALUE self, VALUE orig) { struct ractor_port *dst = RACTOR_PORT_PTR(self); struct ractor_port *src = RACTOR_PORT_PTR(orig); dst->r = src->r; dst->id_ = ractor_port_id(src); return self; }
#inspect ⇒ String
# File 'ractor.rb', line 762
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
#receive ⇒ msg
Receive a message to the port (which was sent there by #send).
port = Ractor::Port.new
r = Ractor.new port do |port|
port.send('message1')
end
v1 = port.receive
puts "Received: #{v1}"
r.join
# Here will be printed: "Received: message1"
The method blocks if the message queue is empty.
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
Output:
Before first receive
Still not received
Received:
Still received only one
Received:
If close_incoming was called on the ractor, the method raises ClosedError
if there are no more messages in the message queue:
port = Ractor::Port.new
port.close
port.receive #=> raise Ractor::ClosedError
# File 'ractor.rb', line 665
def receive __builtin_cexpr! %q{ ractor_port_receive(ec, self) } end
#send(msg, move: false) ⇒ self
Also known as: #<<
Send a message to a port to be accepted by port.receive.
port = Ractor::Port.new
r = Ractor.new do
r.send 'message'
end
value = port.receive
puts "Received #{value}"
# Prints: "Received: message"
The method is non-blocking (will return immediately even if the ractor is not ready to receive anything):
port = Ractor::Port.new
r = Ractor.new(port) do |port|
port.send 'test'}
puts "Sent successfully"
# Prints: "Sent successfully" immediately
end
An attempt to send to a port which already closed its execution will raise ClosedError
.
r = Ractor.new {Ractor::Port.new}
r.join
p r
# "#<Ractor:#6 (irb):23 terminated>"
port = r.value
port.send('test') # raise Ractor::ClosedError
If the obj
is unshareable, by default it will be copied into the receiving ractor by deep cloning.
If the object is shareable, it only send a reference to the object without cloning.
# File 'ractor.rb', line 708
def send obj, move: false __builtin_cexpr! %q{ ractor_port_send(ec, self, obj, move) } end