首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解细胞池

了解细胞池
EN

Stack Overflow用户
提问于 2016-03-10 20:22:26
回答 1查看 470关注 0票数 1

我想我对赛鲁伊德泳池的理解有点坏了。我会在下面解释一下,但在此之前,我会做一个简短的说明。

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池(以避免上述问题),这样我们就可以限制生成线程的数量。

我对细胞池的理解是,细胞池为你维护一个演员池,这样你就可以并行地分配你的任务。

因此,我决定测试它,但是根据我的测试用例,它似乎是按顺序运行的(也就是说,事情从来没有得到分发或并行发生)。

复制这个例子。

sender-1.rb

代码语言:javascript
复制
## Send message `1` to the the_client.rb

sender-2.rb

代码语言:javascript
复制
## Send message `2` to the the_client.rb

the_client.rb

代码语言:javascript
复制
## 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.

receiver.rb

代码语言:javascript
复制
## print the message obtained from the_client.rb

如果sender-2.rbsender-1.rb之前运行,那么在使用sender-1.rb发送的数据之前,池似乎被阻塞了20秒(在the_client.rb中可以看到睡眠时间,可以在这里上看到)。

它在ruby-2.2.2和jRuby-9.0.5.0中的行为是一样的。游泳池采取这种行动的可能原因是什么?

EN

回答 1

Stack Overflow用户

发布于 2016-03-12 03:21:34

您的pool调用不是异步的。

evaluate@pool上的执行仍然需要是.async,正如您在最初的示例中所示,而不是使用池。您仍然需要异步行为,但是als希望有多个处理程序参与者。

接下来,您可能会碰到Pool.async错误。

这意味着在5点击evaluate之后,您的池将失去响应,直到池中至少有一个参与者完成为止。最坏的情况是,如果您快速地获得6+请求,那么6th将占用120秒,因为在执行之前需要5*20秒,然后20秒才能执行自己。

这取决于你的实际操作是什么导致了你的延迟--你可能需要调整你的池的大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35926484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档