在此之后, Ruby 线程限制 - 也适用于任何语言
我试图了解为什么我的线程不起作用。一些答案很清楚,例如:
“..用 fork 创建 4 个子进程将利用你的 4 个内核”这将是我的最终方法,因为线程在我的情况下似乎不起作用。
还有这个:
“..Ruby MRI 线程本身并不能充分利用运行 Ruby 代码的多核 CPU。但这是否对您来说是个问题取决于线程在做什么。如果它们正在对其他线程进行长时间运行的 I/O 调用进程在同一台机器上,你会看到不需要单独进程的好处。线程和多处理作为主题即使是简单的事情也会变得非常复杂。大多数语言会在开箱即用的简单和困难方面做出一些妥协……”
考虑到第二个,我已经从我的代码中删除了所有处理,只留下了 I/O。
这里是:
beginning_time = Time.now
img_processor.load_image(frames_dir+"/frame_0001.png")
img_processor.load_image(frames_dir+"/frame_0002.png")
end_time = Time.now
puts "Time elapsed #{(end_time - beginning_time)*1000} milliseconds"
beginning_time = Time.now
for frame_index in 1..2
greyscale_frames_threads << Thread.new(frame_index) { |frame_number|
puts "Loading Image #{frame_number}"
img_processor.load_image(frames_dir+"/frame_%04d.png"%+frame_number)
}
end
puts "Joining Threads"
greyscale_frames_threads.each { |thread| thread.join } #this blocks the main thread
end_time = Time.now
puts "Time elapsed #{(end_time - beginning_time)*1000} milliseconds"
我得到的是这个......
对于第一个非线程案例:
经过的时间 15561.358 毫秒
对于第二个螺纹案例:
经过的时间 15442.401 毫秒
好的,性能提升在哪里?我错过了什么吗?硬盘是否阻塞?我真的需要生成进程才能在 ruby 中看到真正的并行性吗?