好文!讲如何使用 Test framework 和 Test tool 的文章很多,但是讲如何写好 Test 的文章很少,楼主的文章很棒,感谢分享!
@willmouse 楼主分享,必属精品啊!
签到,哈!
参加参加,感兴趣的话题,非常期待!
参加参加,难得 @lgn21st 在上海滩露面,哈哈!
恭喜,恭喜!
我们一直在生产环境使用 RVM,用得很好,尤其对于升级 Ruby 非常方便,还没有遇太棘手的问题。
#19 楼 @zj0713001 @robbin Rails 3 的多线程确实有比较大的问题,主要是稳定性不行,我搭过一个简单测试例子,使用 Rainbows ThreadPool 方式,允许每个进程最多 64 线程,当并发数到 20 的时候,就有 2% 左右请求失败率,具体原因不祥。期待 Rails 4 正式版本推出的时候,这一问题已解决。
#10 楼 @zj0713001 @robbin 我使用 ruby-2.0.0-p195 试了一下,确实使用多线程有明显加快。
time ruby gil1.rb
real 0m8.708s
user 0m8.664s
sys 0m0.025s
time ruby gil2.rb
real 0m2.102s
user 0m17.630s
sys 0m0.147s
这是在一台 单 CPU 6 核(带超线程)机器,在 ruby-2.0.0-p195 的执行结果。 按理,Ruby 2.0 并没有去除 GIL,应该不能真正并行执行多线程的,有点超出现在的理解范围了,谁能解析一下?
Ruby 能提升 Web 应用吞吐量的原因,见我的另一个帖子: 实例说明 Ruby 多线程的潜力和弱点 http://ruby-china.org/topics/11248
#14 楼 @simonykq Ruby 的 类变量类似于全局变量,对同一进程内的所有线程来说,看到的自然是同一份变量,所以它不是线程安全的。举例子说明比较清晰:
class A
@@var = 'ok'
def method1
@@var = 'ok1'
sleep(2)
puts @@var
end
def method2
@@var = 'ok2'
sleep(1)
puts @@var
end
end
t1 = Thread.new { A.new.method1 }
t2 = Thread.new { A.new.method2 }
t1.join
t2.join
期望代码的结果是
ok1
ok2
但实际结果是
ok2
ok2
原因是,t1 和 t2 访问的是同一个变量 @@var。 要避免这个问题,方法有:
如果实在要写全局变量,在使用该变量的时候加锁。加锁版的代码如下:
class A
@@var = 'ok'
def method1
@@var = 'ok1'
sleep(2)
puts @@var
end
def method2
@@var = 'ok2'
sleep(1)
puts @@var
end
end
lock = Mutex.new t1 = Thread.new { lock.synchronize{ A.new.method1 } } t2 = Thread.new { lock.synchronize{ A.new.method2 } } t1.join t2.join
这个时候,结果是
```ruby
ok1
ok2
名字听着很酷,人不知道怎么样。
#24 楼 @williamherry #25 楼 @loveky #26 楼 @zgm #27 楼 @williamherry 我通常拿一个 IBM 的红点包,装一本 MacBook,MacBook 里运行的是 Windows,这样是否很被鄙视,呵呵。
#2 楼 @yangchenyun #15 楼 @williamherry #16 楼 @otecteng
那就暂定一个主题:探讨 Ruby / Rails 并发模型,以及 Ruby on Rails 线程安全代码问题, 由我来主持,到时大伙一起交流。
config.eager_load_paths accepts an array of paths from which Rails will eager load on boot if cache classes is enabled. Defaults to every folder in the app directory of the application.
把目录加入 eager_load_paths 后,Rails 在启动时会 require 该目录下的所有文件,这样目录下的文件就不会在启动后再次加载了,从而规避了 Ruby require 非线程安全的问题。
Ruby / Rails 并发模型,@robin 的两篇文章非常值得推荐 Web 并发模型粗浅探讨 http://vdisk.weibo.com/s/kiwIU 这个是 ppt Ruby 的多线程应用服务器介绍 http://ruby-china.org/topics/10832