Ruby`Thread#join`与`ThreadsWait.all_waits`

时间:2018-12-03 07:24:39

标签: ruby multithreading

我有一个文件test.rb,其中包含以下代码,该文件从不同线程递增一个共享变量:

require 'thwait'                                                                                                                                                                              

threads_number = ARGV.first.to_i                                                                                                                                                              
incr_number = ARGV.last.to_i                                                                                                                                                                  

start = Time.now                                                                                                                                                                              
sum = 0                                                                                                                                                                                       

create_thread = proc do                                                                                                                                                                       
  Thread.new { incr_number.times { sum += 1 } }                                                                                                                                               
end                                                                                                                                                                                           

threads = threads_number.times.map { create_thread.call }                                                                                                                                     
ThreadsWait.all_waits(*threads)                                                                                                                                                               

p Time.now - start, sum

我在具有不同红宝石版本的同一台计算机上尝试了此代码,并得到以下结果:

  • 红宝石2.5.1p57(2018-03-29修订版63029)[x86_64-linux]

    $ ruby multithreading.rb 4 100000
    0.022668827
    400000
    
  • jruby 9.2.4.1(2.5.0)2018-11-28 f487d1e OpenJDK 64位服务器VM 25.181-b13 on 1.8.0_181-8u181-b13-2〜deb9u1-b13 + jit [linux-x86_64 ]

    $ ruby multithreading.rb 4 100000
    0.095028
    241229
    

我知道ruby 2.5总是会由于GIL而给400000作为总和,而由于多线程,jruby的结果可能会有所不同。

  1. 为什么在这种情况下ruby 2.5更快? jruby不应该比ruby 2.5快吗?
  2. Thread#joinThreadsWait.all_waits有什么区别?

0 个答案:

没有答案