如何在Rails应用程序中检测多线程模式?

时间:2013-08-04 16:36:27

标签: ruby-on-rails ruby multithreading ruby-on-rails-3.2 thread-safety

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

据我所知,Rails不关心多线程,它由Rack中间件控制。但有没有办法检测它?也许用旗帜?

我担心将来会转换到多线程服务器并且我的代码无法正常运行:

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

1 个答案:

答案 0 :(得分:2)

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

在rails 4中你可以做到:

YourApp::Application.allow_concurrency?

并且在rails 3中的方式是:

YourApp::Application.config.allow_concurrency

请注意,您无法使用rails 3在rails 4中执行此操作。如果您很好奇,请查看源代码(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,您应该为多线程服务器做好准备。