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