8.5 并行循环

这一节探讨一些通用的并行模式,来并行执行所有的循环迭代。考虑生成一批全尺寸图像的缩略图的问题。gopl.io/ch8/thumbnail包提供ImageFile函数,它可以缩放单个图像。这里不展示它的实现细节,它可以从gopl.io进行下载。

下面的程序在一个图像文件名字列表上进行循环,然后给每一个图像产生一幅缩略图:

很明显,处理文件的顺序没有关系,因为每一个缩放操作和其他的操作独立。像这样由一些完全独立的子问题组成的问题称为高度并行。高度并行的问题是最容易实现并行的,有许多并行机制来实现线性扩展。

并行执行这些操作,忽略文件I/O的延迟和对同一文件使用多个CPU进行图像slice计算。第一个并行版本准备仅仅添加go关键字。现在将忽略错误,后面再处理:

这一版运行真得太快了,事实上,即使在文件名称slice中只有一个元素的情况下,它也比原始版本要快。如果这里没有并行机制,并发的版本怎么可能运行得更快?答案是makeThumbnails2在没有完成想要完成的事情之前就返回了。它启动了所有的goroutine,每个文件一个,但是没有等它们执行完毕。 ...

Get Go程序设计语言 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.