我正在尝试了解为什么我的线程无法工作。 一些答案非常清晰:
"..用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中看到真正的并行吗?