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

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

我尝试用 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

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 忘了这事了。多谢

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