2015-05-24 23:35:03
来 源
中存储网
Ubuntu
因为CRuby(MRI)本身不支持原生多线程,所以想试一下其他ruby解释器实现对原生多线程的支持.于是安装rubinius折腾一下:) 在rubinius官网下载2.4.1源代码,然后驾轻就熟首先bundle,然后./configure一切正常,在rake最后关头出现错误,提示rubinius内部文件夹中若干

因为CRuby(MRI)本身不支持原生多线程,所以想试一下其他ruby解释器实现对原生多线程的支持.于是安装rubinius折腾一下:)

在rubinius官网下载2.4.1源代码,然后驾轻就熟首先bundle,然后./configure一切正常,在rake最后关头出现错误,提示rubinius内部文件夹中若干文件找不到;奇怪的是再次执行rake后,还是报错,但是文件夹中出现了上次未找到的文件,进去看了一下貌似内容不太对,只有Gemfile和一些README之类的文件,并没有源代码之类的文件.多次执行rake,发现文件夹中文件越来越多,但rake总是不成功.

开始怀疑是源代码过旧,于是从github中clone最新版本2.5.x,下载失败几次后终于成功鸟,一百多兆,解压缩后大了一倍多;然后按部就班,发现在执行./configure时下载了很多gem,于是抱有希望鸟...可是rake时还是报错,错误相同.照理不应该啊!不可能再是源代码的问题,多半是笨猫系统的问题!

静下心来,错误最后的一些细节引起了本猫的注意:隐约一些utf8转换神马ascii8失败之类的词眼云云飘来...忽然联想到:难道是PATH中有中文的原因吗?果不其然,fk!换为全english的path后一切清净了;编译时间不短也不长,最后还有若干UnitTest需要运行测试...剩下的就简单鸟:rake install,再错,加权限后ok!

接下来上测试代码:

#!/usr/bin/ruby

$x = 0
Thread_proc = ->{i=0;($x+=1;i+=1) while(i<10000)}

def make_t(blk)
Thread.new(&blk)
end

t0 = make_t(Thread_proc)
t1 = make_t(Thread_proc)

t0.join
t1.join

puts "$x last is #{$x}"

在MRI和rbx分别5次结果如下:

MRI:

linux@linux:~/src/ruby_src$ ruby a.rb
$x last is 20000
linux@linux:~/src/ruby_src$ ruby a.rb
$x last is 20000
linux@linux:~/src/ruby_src$ ruby a.rb
$x last is 20000
linux@linux:~/src/ruby_src$ ruby a.rb
$x last is 20000
linux@linux:~/src/ruby_src$ ruby a.rb
$x last is 20000

rbx:

linux@linux:~/src/ruby_src$ rbx a.rb
$x last is 17234
linux@linux:~/src/ruby_src$ rbx a.rb
$x last is 17845
linux@linux:~/src/ruby_src$ rbx a.rb
$x last is 11626
linux@linux:~/src/ruby_src$ rbx a.rb
$x last is 14554
linux@linux:~/src/ruby_src$ rbx a.rb
$x last is 16098

结论很简单,印证了本篇的主题。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。