并行处理的基本原理其实很简单:如果一个大型任务能够被分成多个独立的任务单元,它就能够被分布到多个机器上同时处理。如果分布得当的话,并行处理应该能够减少几乎n倍的处理时间(在这里,n等于用于处理这个任务的机器数量)。例如,如果你有一个工作需要30天才能完成,假如你把它分给10台机器去做,那么这个任务就能够在大约3天的时间里完成。
并行处理最困难的部分就是要决定如何分解这个大型任务。如果它被分解之后的每个单元太小,那么同花在处理任务上的时间相比而言,其通讯开销就会非常大。如果它被分解之后的每个单元太大,使用多台机器所获得的优势就会被抵消。理想的分解会让每个子任务的处理时间要比通讯所花费的时间高多个数量级,而且会让每个客户端都有多个任务可以执行。
这个工具能够让你增添或者减少任务、检查队列的状态、从队列里处理任务,或者让一些或所有的机器都处理一个要完成的队列。这个服务器从队列里获取信息,并把它传递给命令解释器。当命令完成的之后,服务器就会检查队列,寻找下一项任务。
你可以在Listing A里找到这个任务服务器的源代码。要使用它,就首先要把脚本保存为一个文件(我把它命名为jobserver.pl),然后再运行它。这个脚本需要Cwd和Term模块,所以如果你还没有这两个模块,就需要安装它们。在离你最近的CPAN镜像服务器里就可以找到这些模块。
每个得到支持的动作都位于一个单独的函数里。还有一些支撑函数能够将任务进行排队和出队操作、写入到共享日志、返回当前服务器的状态,以及其他等等。即使你不使用这个任务服务器本身,这些支撑程序也能够在你自己的项目里发挥重要作用。
这个任务服务器使用基于文件的通讯,这样就没有必要去安装专用的通讯驱动程序。Windows的文件共享或者任何联网的文件共享系统都可以使用。