Rails 关于多线程服务器的问题

allenlsy · 2013年11月11日 · 最后由 allenlsy 回复于 2013年11月12日 · 2611 次阅读

我尝试用Rainbows! 或者Puma作为服务器,单进程16线程。现在在Mac OSX localhost上测试。Rails 4 + ruby 2

现在假设一个用户请求调用了一个method,里面有句话是sleep 60. 在这60秒内,另一个用户想访问网站其他页面,我没有做成功,不知道是哪里错了。请大家帮忙看一下

Rainbows! 配置文件

Rainbows! do
  use :ThreadPool # 我也试过eventmachine
  worker_connections 16
end

# 省略一些Unicorn下的配置。使用Unicorn的配置是服务器跑的很好

Puma的配置文件

#!/usr/bin/env puma
pidfile ...
state_path ...
stdout_redirect ...
threads 0, 16
workers 0
共收到 11 条回复

Puma 在 MRI Ruby 上面这些非 IO 的请求是无法并行的

http://ruby-china.org/topics/15140

#1楼 @huacnlee 谢谢。因为我之前是用unicorn的,所以首选还是用Rainbows!。我想问一下,就我这种不涉及操作shared variable的情况,我认为不会出现race condition这样的情况,需要写什么特殊的代码来保重threadsafe吗? 我对于这个的理解就是,既然我用的是ThreadPool,设置为16线程,那么如果一个线程正在sleep,后面的请求应该是能使用其余的15个 thread来访问网站,是吧?

#1楼 @huacnlee 问题解决了。我的rainbows是在development mode下开的

#3楼 @allenlsy PUMA会阻止线程切换?

#4楼 @clc3123 没研究过,不清楚。。。

#1楼 @huacnlee 补充: 无法并行也可并发...尤其是sleep

#6楼 @jjym #1楼 @huacnlee 经过测试, Puma下我的这种情况,在sleep 60这段时间内,是可以用其他线程来访问网站的。jjym正解。 另外,在Rainbows下,如果使用EventMachine的话,我只是在config file最开始写上了require 'eventmachine',然后Rainbows设置改为use :EventMachine, 仍然不能并发(Concurrent)。那Event machine如何使用呢?有建议吗?

#7楼 @allenlsy 不知道你代码,如果是直接用EM可能是阻塞了主进程,应该考虑defer, rainbows不懂

#7楼 @allenlsy 待研究,不清楚细节

#7楼 @allenlsy EM单线程,sleep就卡住线程了

#10楼 @clc3123 忘了这事了。多谢

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册