• @hugohe 你好。两个子线程跑起来先执行 Thread.stop,让自身进入 sleep 模式。主线程的 run 代码就是为了唤醒他们。导致死锁的原因应该是调用 run 的时候,子线程还没有跑起来(new 以后自动运行)。等 run 之后,子线程自动跑起来,又把自己 stop 了,而 join 没有 timeout 参数,导致死锁。所以加 sleep 一定要在 run 前面,确保 run 的执行发生在 stop 之后。 如果不想用 hardcode 的时间,可以加个 countdown 变量,虽然理论上还是无法保证 100% 不死锁,但发生的概率就非常小了。参考代码如下:

    ....
    wait_thread = 2
    
    threads = [
    Thread.new {
              wait_thread -= 1 Thread.stop ;  c1.chase(c2)
          },
    Thread.new {
              wait_thread -= 1 Thread.stop ; c2.chase(c1)
          }
    ]
    
    while wait_thread > 0 
    end
    
    start_index  = rand(2)
    ....
    

    这里有类似的问题讨论 http://stackoverflow.com/questions/8925001/deadlock-in-ruby-join 以及 Thread 相关 API 的说明 http://rubylearning.com/satishtalim/ruby_threads.html

  • #9 楼 @dddd1919 抱歉没有实际用过,是看到 Github 的描述。可能因为没有 migration 的问题,所以 2.0 也能跑。这种年久失修的 Gem,一直在用,没问题也就算了。不过从来没接触过的,建议最好还是别去碰,学习的时间成本很可能就打水漂了~

  • #7 楼 @dddd1919 貌似 parseexcel 只支持 ruby1.8,多年没更新了。如果 excel 格式比较复杂,或数据量比较大,推荐 2 楼提到的 POI,不用 Juby 可以用 rjb

  • 如下加个 sleep 0.1 试试。可能是主线程跑太快了,或子线程从 Thread.stop 恢复需要时间调度

    sleep 0.1 threads[start_index].run threads[1-start_index].run