访问在Celluloid中通过池初始化的actor的邮箱

时间:2016-03-14 07:50:38

标签: ruby 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 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的实例方法,它给出了正确的结果。当我尝试使用定义了池大小的邮箱时,不确定是什么问题。

1 个答案:

答案 0 :(得分:1)

您正在与actor的邮箱直接交互,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实际上执行了写操作。