Доступ к почтовому ящику для актера, инициализированного через пул в Celluloid

В моем приложении 2 актера. Сервис и PushSocket. Я использую почтовый ящик для связи между двумя участниками Service и PushSocket. Это хорошо работает, когда я просто создаю один экземпляр в PushSocket и добавляю сообщение в его почтовый ящик.

**File: service.rb**

Celluloid::ZMQ.init

class Service
  include Celluloid::ZMQ
  attr_accessor :pushsocket

  def initialize
    initialize_pushsock_actor
    send_messages
  end

  def initialize_pushsock_actor
    @pushsocket = PushSocket.new
  end

  def send_messages
    10.times do
      puts 'sending data'
      @pushsocket.mailbox << 'test'
    end
  end
end

**File: push_socket.rb**

Celluloid::ZMQ.init
class PushSocket
  include Celluloid::ZMQ

  def initialize
    async.wait_for_my_messages
  end

  def wait_for_my_messages
    loop do
      message = receive { |msg| msg }
      puts "Got a Message: #{message.inspect}"
    end
  end
end

Но когда попробуйте то же самое с пулом, это не сработает, как ожидалось. Я не получаю никаких сообщений в push-сокете.

**File: service.rb**

Celluloid::ZMQ.init
class Service
  include Celluloid::ZMQ
  attr_accessor :pushsocket

  def initialize
    initialize_pushsock_actor
    send_messages
  end

  def initialize_pushsock_actor
    @pushsocket = PushSocket.pool(size: 10)
  end

  def send_messages
    10.times do
      puts 'sending data'
      @pushsocket.mailbox << 'test'
    end
  end
end


**File: push_socket.rb**

Celluloid::ZMQ.init
class PushSocket
  include Celluloid::ZMQ

  def initialize
    async.wait_for_my_messages
  end

  def wait_for_my_messages
    loop do
      message = receive { |msg| msg }
      puts "Got a Message: #{message.inspect}"
    end
  end
end

Чтобы это работало, я использую метод экземпляра push-сокета, который дает правильные результаты. Не уверен, что проблема, когда я пытаюсь использовать почтовый ящик с определенным размером пула.

1 ответ

Вы напрямую взаимодействуете с почтовым ящиком актера, который Pool реализации блокируют прямой доступ к.

Но вы все равно не должны напрямую взаимодействовать с почтовым ящиком.

Вместо этого:

@pushsocket.mailbox << "test string"

Сделай это:

@pushsocket.write("test string")

ПРИМЕЧАНИЕ: у вас все еще может быть логическая ошибка в вашей реализации пулов. Когда вы пишете в сокетный актер, вы не знаете, в какой сокет вы пишете. Это хорошо, если вы реализуете какой-то конвейер, независимый от последовательности, где каждый push разъем подключается к одному pull сокет, и вам все равно, какой актер сокета фактически выполняет операцию записи.

Другие вопросы по тегам