Ruby on rails Rails线程安全模块

Ruby on rails Rails线程安全模块,ruby-on-rails,ruby,thread-safety,Ruby On Rails,Ruby,Thread Safety,我想在基于实例变量的应用程序控制器中包含模块 我现在有这样的事情: class ApplicationController before_filter :include_module def include_module @@site = "foo" class_eval{ include @@site.classify.constantize::Bar } end end 但是,我希望使这个代码段线程安全。可能吗?我想要实现的是每个请求加载模块,其名称取决于一

我想在基于实例变量的应用程序控制器中包含模块

我现在有这样的事情:

class ApplicationController

  before_filter :include_module

  def include_module
    @@site = "foo"
    class_eval{ include @@site.classify.constantize::Bar }
  end
end

但是,我希望使这个代码段线程安全。可能吗?我想要实现的是每个请求加载模块,其名称取决于一些变量。

AFAIK Rails是线程安全的,在MRI上是单线程的。然而,背景很重要。你是在运行MRI还是JRuby?我建议你把下面的3个通读一遍


编辑:如果rails应用程序是单线程的,那么变量是线程安全的。我以前应该加上这个。在这种情况下,Rails是线程安全的。

所以对于每个请求,您都要加载/评估一个模块?这似乎是一个非常糟糕的主意,是否有更好的方法来做您想做的事情?是的,我也认为,每次我使用class_eval,上帝都会杀死一只小猫,但我想做的是:是的,我也认为,每次我使用class_eval时,上帝都会杀死一只小猫,但我想做的是:想象一下,一个rails应用程序处理许多页面,这些页面共享一些代码库,但其中许多页面是不同的。这就是为什么我提出了“控制器部件”的想法——想法是在控制器中有默认操作,但对于某些站点(子域),自定义操作将从控制器部件加载并执行,因此给定操作的代码将不同。尽管对操作系统来说,MRI是单线程的,对你的程序来说,它看起来像是一个充满种族条件和信号量的可怕世界。“当心!”利努希奥斯,我不确定。你能举个例子吗?我正在使用ruby运行相当复杂的大型系统,并且已经做出了单线程假设,并且没有面临竞争条件。你说的是什么样的竞争条件?@av:从Ruby MRI 1.9开始,Ruby对每个Ruby线程使用真正的OS线程(UNIX上的pthreads),但是Ruby一次只能在一个线程中执行Ruby代码。因此,当一个OS线程可以等待IO或执行普通C时,它不能执行Ruby。另外,因为Ruby线程是预先调度的,这意味着可以在执行过程中抢占一个代码语句,将变量留在未定义状态,或者在关键部分的中间。因此,当您有多个Ruby线程时,您需要使用互斥锁锁定变量。@av:设想一个程序有两个线程,所有线程都递增全局变量
$c
。每个都包含以下内容:
10000.times{$c+=1}
。因此,第一个线程执行添加的
$c+1
,但不执行赋值。然后线程2完成添加和赋值,将
$c
留在
1
(它开始时为0)。现在,我们回到线程1,它将1赋值给
$c
。现在我们有了两个
+=
s,但我们只在
$c
中添加了一个,而不是2个。这是经典的比赛条件。在像JRuby这样的真正多线程实现中,情况会变得更糟,where@av:线程可以同时(在多处理器系统上)访问变量,也可以非常接近(在单核系统上)。然后你可以从一个加法中得到上半位,从另一个加法中得到下半位。每当两个线程访问共享资源时,必须使用互斥锁、信号量或其他访问控制机制将其锁定。