Dan*_*ark 7 ruby multithreading ruby-on-rails
Rails控制器是多线程的吗?
如果是这样,我可以通过简单地执行从多个线程运行来保护某段代码(每十分钟只触发一次)
require 'thread'
Thread.exclusive do
# stuff here
end
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式在显示器上同步吗?
cwn*_*nja 13
rake middleware
在基本的rails应用程序上运行提供以下内容:
use Rack::Lock
use ActionController::Failsafe
use ActionController::Reloader
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActiveRecord::SessionStore, #<Proc:0x017fb394@(eval):8>
use ActionController::RewindableInput
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
run ActionController::Dispatcher.new
Run Code Online (Sandbox Code Playgroud)
机架堆栈上的第一项是Rack::Lock
.这会锁定每个请求,因此一次只能处理一个请求.因此,标准 rails应用程序是单线程的.但是,您可以在请求中生成新线程,这将使您的应用程序具有多线程,大多数人从未遇到过这种情况.
如果你有问题......
require 'thread'
Thread.exclusive do
# stuff here
end
Run Code Online (Sandbox Code Playgroud)
...将确保块内的东西永远不会与任何其他代码并行运行.Mutext
在所有线程之间创建共享(在类变量或类似的东西中,但是这可以在开发模式下重新加载时擦除,所以要小心),并且Rack::Lock#call
如果你只想确保没有两个实例,那么首选锁定它同一个代码同时执行.
此外,对于记录,每个请求在每个请求周期中创建和取消引用一个控制器.没有两个请求应该看到相同的实例,尽管它们可能看到相同的类.
设置config.threadsafe!
空隙几乎所有我说.Rack::Lock
从堆栈中删除,意味着您需要手动设置互斥锁以防止双重输入.除非你有充分的理由,否则不要这样做.
即使没有Rack::Lock
你,每个请求仍然会得到一个控制器实例.入口点到控制器保证,注意到呼叫new
在process
.
归档时间: |
|
查看次数: |
6063 次 |
最近记录: |