GNUparallel是一个可以并行执行任务的shell工具。这是一个perl脚本。本文中的所有示例都在Bash环境中运行。虽然在我第一次尝试之前就知道有这样的工具,但我从来没有想过要用它。今天在删除我的Gentoo系统/usr/src目录下的老版本内核源码目录时用了一次,效果很好。$cd/usr/src$lsls-dlinux-*linux-4.8.10-gentoo/linux-4.8.5-gentoo/linux-4.8.7-gentoo/linux-4.8.12-gentoo/linux-4.8。6-gentoo/linux-4.8.9-gentoo/linux-4.8.12-gentoo是我目前使用的内核版本的源码。我只想保留它并删除其他源代码目录。这些源码目录除了内核源码文件外,还有我编译时产生的中间文件,占用硬盘空间太大,每个源码目录占用空间差不多1.2GB。我想删除它之前。当我记不住bash的for循环语法的时候,我就一个一个的rm-rf。如果你没有忘记for的语法,就这样删除它:$foriinlinux-4.8.{5,6,7,8,9,10}-gentoo;做sudorm-rf$i;done总是忘记bash的for语法是因为通常使用的Shell是fish。fish的for语法与bash不同。结果,我不记得它们中任何一个的for语法。对于这个删除文件或目录的特定任务,更容易做到:$sudorm-rflinux-4.8.{5,6,7,8,9,10}-gentoo现在使用GNUparallel,很简单更多:$sudoparallelrm-rf:::linux-4.8.{5,6,7,8,9,10}-gentoo更重要的是,如果并行执行的任务是并行的。对于较慢的任务,在多核机器上,这是一个福音。如果你没有什么可删除的,你可以试试下面的命令对系统没有任何伤害来体验并行:$parallelecho:::linux-4.8.{5,6,7,8,9,10}-gentoo生成每个povray动画帧并行假设povray的渲染脚本为foo.pov,动画配置文件为foo-{1,2,3,4}.ini。并行执行4个povray进程绘制一个30帧的动画分为四组:$parallelpovray::::foo-{1,2,3,4}.ini$convert-delay10-loop0foo*.pngfoo.gif下面的命令可以用来制作povray命令需要的4个.ini文件的内容:$cat<foo.iniCyclic_Animation=onInput_File_Name=foo.povInitial_Frame=1Final_Frame=30Initial_Clock=1Final_Clock=0EOF$seq4|并行cpfoo.inifoo-{}.ini$并行--link'echoSubset_Start_Frame={1}|tee-afoo-{2}.ini':::181522:::1234$parallel--link'echoSubset_End_Frame={1}|tee-afoo-{2}.ini':::7142130:::1234测试用的3D模型,在四核机器上,使用单povray进程,需要207秒渲染60帧。将这60帧分成4组,然后使用parallel调用4个povray进程进行渲染,只需要92秒。虽然并行度没有预期的那么快,但由于单个povray进程在光线追踪操作期间使用2个线程,如果我的机器有8个CPU内核,渲染时间应该会下降到50秒左右。零的并行下载和并行化这个在我们家只有一点用处。$parallel'wgethttp://192.168.0.7:8080/meta-doc/agn_{}.zero'::::数组列表点kd_treebkd_tree$parallel'zero-mnight-e"agn_{}.h,agn_{}.c"agn_{}.zero':::arraylistpointskd_treebkd_tree避免加载并行过程两次,以上两条命令可以“叠加”在一起:$parallel'wgethttp://192.168.0.7:8080/meta-doc/agn_{}.zero;\zero-mnight-e"agn_{}.h,agn_{}.c"agn_{}.zero'\::::arraylistpointskd_treebkd_treezero这是什么,这个需要看《零的故事系列》。shell变量和数组的传递shell中的变量和数组可以通过env_parallel传递给并行程序。例如:$LOCATION="http://192.168.0.7:8080/meta-doc"$ZERO_FILES=(arraylistpointskd_treebkd_tree)$source`whichenv_parallel.bash`$env_parallel'echo$LOCATION/agn_{}。零':::${ZERO_FILES[*]}http://192.168.0.7:8080/meta-doc/agn_array.zerohttp://192.168.0.7:8080/meta-doc/agn_list.zerohttp://192.168。0.7:8080/meta-doc/agn_points.zerohttp://192.168.0.7:8080/meta-doc/agn_kd_tree.zerohttp://192.168.0.7:8080/meta-doc/agn_bkd_tree.zero应该还没有完成,到待续...…