我的应用中有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 socket中没有收到任何消息。
**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 socket的实例方法,它给出了正确的结果。当我尝试使用定义了池大小的邮箱时,不确定是什么问题。
答案 0 :(得分:1)
plt.show(block=False)
#Running simulator, but not unable to receive events.
for i in xrange(10):
print "Working %s" %i
sleep(1)
实现阻止直接访问。但是你不应该直接与邮箱互动。
而不是:
Pool
执行此操作:
@pushsocket.mailbox << "test string"
注意:您的池实施中可能仍存在逻辑错误。当您写入套接字actor时,您不知道您要写入的底层套接字。没关系, if 你正在实现某种与序列无关的管道,其中每个@pushsocket.write("test string")
套接字连接到一个push
套接字,而你不关心哪个套接字actor实际上执行了写操作。