1

我可以在 Rails 应用程序中检测多线程模式吗?

我知道 Rails 不关心多线程,它由 Rack 中间件控制。但是有什么方法可以检测到吗?也许使用旗帜?

我担心将来过渡到多线程服务器时会发生这种情况,我的代码将无法正常工作:

  prev_zone = Time.zone
  Time.zone = @channel.city_time_zone
  res = Time.zone.parse(str, base_date)
  Time.zone = prev_zone
4

1 回答 1

2

似乎有一种方法可以确定您的 rails 应用程序是否运行多线程,但在 rails 3 和 4 之间略有不同。

在 Rails 4 中,您可以执行以下操作:

YourApp::Application.allow_concurrency?

在 rails 3 中,你想要的方式是:

YourApp::Application.config.allow_concurrency

请注意,您不能在 rails 4 中使用 rails 3 的方式。如果您好奇为什么,请查看源代码(https://github.com/rails/rails/blob/master/railties/lib/ rails/application/default_middleware_stack.rb#L68)。

正如您自己发现的那样,主动支持提供了一个名为#use_zone 的方便方法:

[15] pry(main)> Time.use_zone('Sydney') { Time.zone.parse('01/01/2013 12am') }.utc
=> 2012-12-31 13:00:00 UTC
[16] pry(main)> Time.use_zone('Berlin') { Time.zone.parse('01/01/2013 12am') }.utc
=> 2012-12-31 23:00:00 UTC
[17] pry(main)> Time.use_zone('Alaska') { Time.zone.parse('01/01/2013 12am') }.utc
=> 2013-01-01 09:00:00 UTC

它主要是按照您的方式实现的,有一个小例外:他们使用线程局部变量来存储中间时区以使代码线程安全:https ://github.com/rails/rails/blob/master/activesupport/ lib/active_support/core_ext/time/zones.rb#L39

他们还使用确保块来恢复原始时区:https ://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/zones.rb#L49

因此,通过使用主动支持的 Time#use_zone,您应该为多线程服务器做好准备。

于 2013-08-14T15:11:33.490 回答