class Ractor::Port
Port 对象在 Ractor 之间传输消息。
Public Class Methods
Source
static VALUE
ractor_port_initialize(VALUE self)
{
return ractor_port_init(self, GET_RACTOR());
}
返回一个新的 Ractor::Port 对象。
Public Instance Methods
Source
# File ractor.rb, line 806 def close __builtin_cexpr! %q{ ractor_port_close(ec, self) } end
关闭端口。禁止向已关闭的端口发送消息。如果消息队列中没有消息,也禁止接收。
只有创建该端口的 Ractor 才能关闭它。
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
返回端口是否已关闭。
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
从端口接收消息(该消息由 Port#send 发送)。只有创建该端口的 ractor 才能通过此方式接收消息。
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"
如果消息队列为空,此方法将阻塞当前 Thread。
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
输出
Before first receive Still not received Received: message1 Still received only one Received: message2
如果端口已关闭且消息队列中没有更多消息,则该方法会引发 Ractor::ClosedError。
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
向端口发送消息,以供 port.receive 接收。
port = Ractor::Port.new r = Ractor.new(port) do |port| port.send 'message' end value = port.receive puts "Received #{value}" # Prints: "Received: message"
此方法是非阻塞的(即使创建该端口的 ractor 未准备好接收任何内容,它也会立即返回)
port = Ractor::Port.new r = Ractor.new(port) do |port| port.send 'test' puts "Sent successfully" # Prints: "Sent successfully" immediately end
尝试向已关闭的端口发送消息将引发 Ractor::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
如果 obj 是不可共享的,默认情况下,它将通过深层克隆复制到接收 ractor 中。
如果对象是可共享的,则对象的引用将被发送到接收 ractor。
也别名为:<<