1

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

我知道Rails并不关心多线程,它受Rack中间件控制。但是有什么方法来检测它?也许使用一个标志?

我担心将来会过渡发生在一个多线程的服务器和我的代码将无法正常工作:

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

回答

2

似乎有是一种方法来确定你的Rails应用程序是否运行多线程或不是,但它的轨道3和4

在轨道4,5

之间略有不同,你可以这样做:

YourApp::Application.allow_concurrency? 

和轨道3,你会以它的方式是:

YourApp::Application.config.allow_concurrency 

请注意,如果你很好奇,为什么那么检查出的源代码(https://github.com/rails/rails/blob/master/railties/lib/rails/application/default_middleware_stack.rb#L68),你不能使用轨道中轨4.做它的3路。

,你发现了自己,有一个叫#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

他们还使用确保块以恢复原始时区:通过使用活性支撑氏T https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/zones.rb#L49

所以ime#use_zone你应该为多线程服务器做好准备。

+0

是的,你说得对!而我忘记了http://apidock.com/rails/Time/use_zone/class :)但现在我知道allow_concurrency,谢谢! –

+0

我更新了我的答案以反映您的发现。 – Linki

相关问题