Spec-Zone.ru › Ruby 4.0
  1. Ractor::
  2. Port

class Ractor::Port

Родительский класс:
Object

Объекты Port передают сообщения между Ractor.

Открытые методы класса

Ractor::Port.new → new_port Показать исходный код
static VALUE
ractor_port_initialize(VALUE self)
{
    return ractor_port_init(self, GET_RACTOR());
}

Возвращает новый объект Ractor::Port.

Открытые методы экземпляра

<<
Псевдоним для: send
close Показать исходный код
# 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
closed? → true/false Показать исходный код
# File ractor.rb, line 817
def closed?
  __builtin_cexpr! %q{
    ractor_port_closed_p(ec, self);
  }
end

Возвращает значение, указывающее, закрыт ли порт.

inspect → string Показать исходный код
# 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
receive → msg Показать исходный код
# 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
send(msg, move: false) → self Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API