class Ractor::Port
Объекты Port передают сообщения между Ractor.
Открытые методы класса
static VALUE
ractor_port_initialize(VALUE self)
{
return ractor_port_init(self, GET_RACTOR());
} Возвращает новый объект Ractor::Port.
Открытые методы экземпляра
# 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
# File ractor.rb, line 817
def closed?
__builtin_cexpr! %q{
ractor_port_closed_p(ec, self);
}
end Возвращает значение, указывающее, закрыт ли порт.
# 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 # 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
# 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 будет отправлена ссылка на объект.
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.