代码之家  ›  专栏  ›  技术社区  ›  user3309314

Ruby`线程#连接`vs`ThreadsWait.所有的等待`

  •  0
  • user3309314  · 技术社区  · 6 年前

    我有档案 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
    

    我在同一台计算机上用不同的ruby版本尝试了这段代码,得到了以下结果:

    • ruby 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
      

    我知道Ruby2.5总是可以 400000 因为吉尔的缘故 jruby 的结果可能因多线程而不同。

    1. 为什么Ruby2.5在这种情况下更快?jruby不应该比ruby2.5快吗?
    2. 有什么区别 Thread#join ThreadsWait.all_waits ?
    0 回复  |  直到 6 年前