我在构建Ruby应用程序。我有一组我想要灰度的图像。我以前是这样的代码:Ruby多线程性能问题
def Tools.grayscale_all_frames(frames_dir,output_dir)
number_of_frames = get_frames_count(frames_dir)
img_processor = ImageProcessor.new(frames_dir)
create_dir(output_dir)
for i in 1..number_of_frames
img_processor.load_image(frames_dir+"/frame_%04d.png"%+i)
img_processor.greyscale_image
img_processor.save_image_in_dir(output_dir,"frame_%04d"%+i)
end
end
线程的代码之后:
def Tools.greyscale_all_frames_threaded(frames_dir,output_dir)
number_of_frames = get_frames_count(frames_dir)
img_processor = ImageProcessor.new(frames_dir)
create_dir(output_dir)
greyscale_frames_threads = []
for frame_index in 1..3
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)
img_processor.greyscale_image
img_processor.save_image_in_dir(output_dir,"frame_%04d"%+frame_number)
puts "Greyscaled Image #{frame_number}"
}
end
puts "Starting Threads"
greyscale_frames_threads.each { |thread| thread.join }
end
我所期待的是正在催生对每个图像的线程。我有1000张图片。分辨率是1920 * 1080。所以我如何看待事情就是这样。我有一个线程数组,我称之为.join。因此,加入将采取所有线程,并一个接一个地启动它们?这是否意味着它会等到线程1完成,然后启动线程2?那么多线程的要点是什么?
我想是这样的:
运行所有在同一时间线程和其他后没有之一。在数学上,它将在完成1帧的同一时间内完成所有1000帧,对吗?
也可以有人解释我什么。加入呢? 从我的理解.join将停止主线程,直到你的线程完成? 如果你不使用.join,那么线程将运行后台,主线程将继续。
那么使用.join有什么意义?我想让我的主线程继续运行,并让后台的其他线程执行某些操作?
感谢您的任何帮助/澄清!
也许你应该看看'resque'这样的背景工具工具,如数学上的“ –
” - 如果创建线程花费0个时间,并且你有足够的CPU周期和RAM,那么是的。在实践中,这应该会严重损坏您的电脑。 – Dogbert
*它会在完成1帧的同时完成所有1000帧,对吗?*给定1000个内核和一些内存,是的。 – Stefan