Доступ к почтовому ящику для актера, инициализированного через пул в 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
сокет, и вам все равно, какой актер сокета фактически выполняет операцию записи.