在使用多进程应用服务器并在控制器操作中运行Thread.new
(生成多个线程)时,是否实现了并行处理?还是GIL阻止了这种情况的发生?
在使用多进程应用服务器并在控制器操作中运行Thread.new
(生成多个线程)时,是否实现了并行处理?还是GIL阻止了这种情况的发生?
@tadman的回答完全正确,我只想在第三段稍微扩展一下。
何时在MRI Ruby中使用线程是一个好的选择?通常情况下,如果您受到IO操作的限制,那么线程就很有用。因此,如果您有一个Rails动作,其中包含许多数据库查询和/或http请求,您可以将它们放入一个Thread中,在Thread本地变量中安全地进行请求,然后将它们合并,并处理线程本地变量。这样,您将实现明显的性能改进。
可能看起来像这样:
threads << Thread.new do
ActiveRecord::Base.connection_pool.with_connection do
t = Thread.current
t[:variable_name] = Model.find_by(col: data)
end
end
joined_threads = threads.map &:join
joined_threads.each do |t|
t.keys.each do |key|
k = key.to_s.downcase
next if k.start_with?("active") || k.start_with?("__")
instance_variable_set "@#{key}", t[key]
end
end