Ruby 1.9中的自动加载线程安全吗?

时间:2010-05-14 22:02:21

标签: ruby multithreading autoload ruby-1.9

在我看来,Ruby社区自this famous thread以来一直关注自动加载,因为出于线程安全原因而不鼓励使用它。

有人知道这不再是Ruby 1.9.1或1.9.2中的问题吗?我已经看过一些关于包装需求的讨论等等,但1.9更改日志(或者至少和我能找到的一样多)似乎并没有解决这个特定的问题。我想知道我是否可以在没有任何合理悲伤的情况下合理地开始自动加载仅1.9的库。

提前感谢任何见解。

3 个答案:

答案 0 :(得分:9)

带来2011年的更新,因为我也很好奇。

目前已开通两张门票:

核心开发人员建议在CRuby / JRuby 1.9中,require和autoload以相同的方式工作并且是线程安全的。这就是ruby保持锁定直到文件完全加载的意义上。

然而,这会产生引入潜在死锁的不便副作用。具体做法是:

  1. Th1加载A并将其锁定
  2. Th2加载B并将其锁定
  3. Th1尝试加载B作为加载A的一部分,开始等待Th2
  4. Th2尝试加载A作为加载B的一部分,开始等待Th1
  5. 死锁...
  6. 结论可能是:如果您的应用程序中存在任何可能的死锁,请在启动线程之前需要您需要的所有内容。

答案 1 :(得分:7)

我不知道一般情况,但该线程的repro示例在1.9.1中没有中断:

autoloaded.rb:

sleep 1
Bar::Foo = 1

autoloader.rb:

module Bar
   autoload :Foo, 'autoloaded.rb'
end

t1 = Thread.new { Bar::Foo }
t2 = Thread.new { Bar::Foo }
t1.join; t2.join

答案 2 :(得分:-4)

它总是被打破。

subload允许您在线程环境中切换模式。

我仍然在线程环境中使用自动加载,但仅限于单线程启动序列。我认为没有任何理由在现实世界的应用程序中使用多线程启动过程。如果你有一个,你可能需要排队加载共享库的操作,因为你总是会遇到类和实例级别设置的线程安全问题,大部分都是这样的:

class Lib
  extend SomeClassFuncs
  do_something_with_class_funcs
end

此代码不是加载时的线程安全,与加载程序无关。

如果你看不到这一点,你就不应该穿线。