我想我对赛鲁伊德泳池的理解有点坏了。我会在下面解释一下,但在此之前,我会做一个简短的说明。
Note:我们的系统运行时遇到了一个通过ZeroMQ传递消息的fast client。
使用下面的Vanilla Celluloid应用程序
类VanillaClient包括VanillaClient::ZMQ读取循环{VanillaClient end def evaluate_response(data) ##,在这里可以找到使用延迟的原因。Celluloid.defer do ExternalService.execute(数据)端端
我们的系统在一段时间后导致失败,原因是'Can't spawn more thread' (或类似的原因)。
因此,我们打算使用Celluloid池(以避免上述问题),这样我们就可以限制生成线程的数量。
我对细胞池的理解是,细胞池为你维护一个演员池,这样你就可以并行地分配你的任务。
因此,我决定测试它,但是根据我的测试用例,它似乎是按顺序运行的(也就是说,事情从来没有得到分发或并行发生)。
复制这个例子。
## 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如果sender-2.rb在sender-1.rb之前运行,那么在使用sender-1.rb发送的数据之前,池似乎被阻塞了20秒(在the_client.rb中可以看到睡眠时间,可以在这里上看到)。
它在ruby-2.2.2和jRuby-9.0.5.0中的行为是一样的。游泳池采取这种行动的可能原因是什么?
发布于 2016-03-12 03:21:34
您的pool调用不是异步的。
evaluate在@pool上的执行仍然需要是.async,正如您在最初的示例中所示,而不是使用池。您仍然需要异步行为,但是als希望有多个处理程序参与者。
接下来,您可能会碰到Pool.async错误。
这意味着在5点击evaluate之后,您的池将失去响应,直到池中至少有一个参与者完成为止。最坏的情况是,如果您快速地获得6+请求,那么6th将占用120秒,因为在执行之前需要5*20秒,然后20秒才能执行自己。
这取决于你的实际操作是什么导致了你的延迟--你可能需要调整你的池的大小。
https://stackoverflow.com/questions/35926484
复制相似问题