gpt4 book ai didi

ruby - 访问通过 Celluloid 中的池初始化的 Actor 的邮箱

转载 作者:数据小太阳 更新时间:2023-10-29 08:07:26 25 4
gpt4 key购买 nike

我的应用中有 2 个 Actor 。服务和 PushSocket。我正在使用邮箱在两个 Actor 服务和 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

但是当尝试使用 pool 时,它并没有按预期工作。我没有在推送套接字中收到任何消息。

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

最佳答案

您正在直接与 Actor 的邮箱交互,Pool 实现阻止直接访问。

But you shouldn't be directly interacting with the mailbox anyway.

代替这个:

@pushsocket.mailbox << "test string"

这样做:

@pushsocket.write("test string")

注意:您在池的实现中仍然可能存在逻辑错误。当您写入套接字 actor 时,您不知道要写入哪个底层套接字。没关系,如果您正在实现某种与序列无关的管道,其中每个 push 套接字连接到单个 pull 套接字,并且您不关心哪个 socket actor 实际执行写操作。

关于ruby - 访问通过 Celluloid 中的池初始化的 Actor 的邮箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35982064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com