Ruby 了解赛璐珞池
我想我对赛璐珞池的理解有点支离破碎。我将尝试在下面进行解释,但在此之前,我会做一个简短的说明 注意:我们的系统运行在一个非常Ruby 了解赛璐珞池,ruby,celluloid,Ruby,Celluloid,我想我对赛璐珞池的理解有点支离破碎。我将尝试在下面进行解释,但在此之前,我会做一个简短的说明 注意:我们的系统运行在一个非常快速的客户机上通过ZeroMQ传递消息 使用以下香草赛璐珞应用程序 我们的系统在一段时间后出现故障,原因是“无法生成更多线程”(或类似情况) 因此,我们打算使用赛璐珞池(以避免上述问题),以便限制生成的线程数量 我对赛璐珞池的理解是 赛璐珞池为您维护一个演员池,以便您可以并行分配任务 因此,我决定对它进行测试,但根据我的测试用例,它似乎是连续运行的(即,事情永远不会得到分发
快速的客户机上
通过ZeroMQ传递消息
使用以下香草赛璐珞应用程序
我们的系统在一段时间后出现故障,原因是“无法生成更多线程”(或类似情况)
因此,我们打算使用赛璐珞池(以避免上述问题),以便限制生成的线程数量
我对赛璐珞池的理解是
赛璐珞池为您维护一个演员池,以便您可以并行分配任务
因此,我决定对它进行测试,但根据我的测试用例,它似乎是连续运行的(即,事情永远不会得到分发或并行发生)
复制这一点的示例
如果sender-2.rb
在sender-1.rb
之前运行sender-2.rb
,则在使用sender-1.rb发送的数据之前,池似乎被阻塞了20
秒(可以查看客户端.rb
的睡眠时间)
它在ruby-2.2.2和jRuby-9.0.5.0下的行为相同。池以这种方式运行的可能原因是什么?您的Pool
调用不是异步的。
在@pool
上执行evaluate
时需要保持.async
的状态,就像在原始示例中一样,不使用池。您仍然需要异步行为,但希望有多个处理程序参与者
接下来,您可能会遇到Pool.async
错误。
这意味着在5
点击evaluate
后,您的池将变得无响应,直到池中至少有一个参与者完成。最坏的情况是,如果您连续快速收到6+
请求,则6
将花费120
秒,因为执行前需要5*20
秒,然后20
秒执行自身
根据导致延迟的实际操作,您可能需要调整池大小。您的池调用不是异步的。
在@pool
上执行evaluate
时需要保持.async
的状态,就像在原始示例中一样,不使用池。您仍然需要异步行为,但希望有多个处理程序参与者
接下来,您可能会遇到Pool.async
错误。
这意味着在5
点击evaluate
后,您的池将变得无响应,直到池中至少有一个参与者完成。最坏的情况是,如果您连续快速收到6+
请求,则6
将花费120
秒,因为执行前需要5*20
秒,然后20
秒执行自身
根据您的实际操作导致延迟的原因,您可能需要调整池大小。@Digital极端主义您的想法?@Digital极端主义您的想法?
class VanillaClient
include Celluloid::ZMQ
def read
loop { async.evaluate_response(socket.read_multipart)
end
def evaluate_response(data)
## the reason for using defer can be found over here.
Celluloid.defer do
ExternalService.execute(data)
end
end
end
## Send message `1` to the the_client.rb
## Send message `2` to the the_client.rb
## take message from sender-1 and sender-2 and return it back to receiver.rb
## heads on, the `sleep` is introduced to test/replicate the IO block that happens in the actual code.
## print the message obtained from the_client.rb