gpt4 book ai didi

ruby-on-rails - Ruby 中的线程会提高并发性吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:10:13 25 4
gpt4 key购买 nike

我的问题是针对 MRI 的。看起来从 Ruby 1.9 开始所有线程都是原生的,但 MRI 继续一次运行一个线程。这听起来好像线程的并行执行在 MRI 中是不可能的,但是对于看起来像这样的东西,使用线程是否可以提高程序的并发性?

换句话说,使用线程将大量文件上传到 S3 有什么好处吗?

# https://gist.github.com/milesmatthias/25c15fd8384d4a7e76f2

...

file_number = 0
mutex = Mutex.new
threads = []

thread_count.times do |i|
threads[i] = Thread.new {
until files.empty?
mutex.synchronize do
file_number += 1
Thread.current["file_number"] = file_number
end
file = files.pop rescue nil
next unless file

data = File.open(file)

if File.directory?(data)
data.close
next
else
obj = s3_bucket.objects[path]
obj.write(data, { acl: :public_read })
data.close
end

end
}
end
threads.each { |t| t.join }

...

最佳答案

YARV 有一个 Giant VM Lock (GVL),可以防止两个线程同时进入解释器循环。没错。

然而,这仅意味着您不能让两个并行线程同时运行 Ruby 代码(或更准确地说,YARV 字节码)。您可以让并行线程同时运行 C 代码(以及整个核心库,以及标准库的大部分,有些 Gem 实际上是用 C 编写的,而不是 Ruby),您可以让并行线程执行或等待 I/O,您可以让 C 扩展在并行线程中执行它们喜欢的操作(运行 Ruby 代码除外)。

所以,是的,即使在 YARV 上,线程也可以提高性能。

关于ruby-on-rails - Ruby 中的线程会提高并发性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29114290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com