当我在Rails / Rack请求中调用Thread.new时,执行上下文会发生什么?

时间:2012-01-02 10:40:45

标签: ruby-on-rails ruby

假设已经生成了三个Rails实例并且正在接收请求。

对于每个请求,Thread.new被称为一堆次数,以便在带外提出一些交叉问题并更快地返回响应。

让我感到困惑的是在Rails实例的幕后发生的事情。

我猜想在产生的所有线程都已完成执行之前,Rails实例还没有准备好处理另一个请求?

1 个答案:

答案 0 :(得分:2)

要安全地执行此操作,您需要在rails中启用threadsafe选项:

config.threadsafe!

否则,结果可能未定义(取决于您执行的操作)。

在任何一种情况下,在处理另一个请求之前,Rails将阻塞线程。为此,您必须在线程上调用#join。线程将很乐意在后台继续处理。如果您正在寻找更具体的内容,请发布一些代码。

请注意,通常使用delayed_jobfactory_girl等库来提供后台处理,而不是自己实例化线程。有关为什么你也使用具有良好线程支持的ruby实现(我使用JRuby)的一个很好的论据,请参阅后者的文档。如果你正在广泛地这样做。