Chr*_*son 6 parallel-processing bash
我经常发现自己编写简单的for循环来对许多文件执行操作,例如:
for i in `find . | grep ".xml$"`; do bzip2 $i; done
Run Code Online (Sandbox Code Playgroud)
看起来有点令人沮丧的是,在我的4核机器上只有一个核心被使用..有一种简单的方法可以为我的shell脚本添加并行性吗?
编辑:为我的问题介绍更多的背景,对不起,我开始时并不是更清楚!
我经常想在合理大小的数据集(通常在100到10,000之间)上运行简单(ish)脚本,例如绘制图形,压缩或解压缩,或运行某些程序.我用来解决这些问题的脚本看起来像上面那样,但可能有不同的命令,甚至是一系列要执行的命令.
例如,刚才我正在运行:
for i in `find . | grep ".xml.bz2$"`; do find_graph -build_graph $i.graph $i; done
Run Code Online (Sandbox Code Playgroud)
所以我的问题绝不是特定于bzip的!(虽然并行bzip确实看起来很酷,但我打算将来使用它).
Joh*_*itb 14
解决方案:使用xargs并行运行(不要忘记-n选项!)
find -name \*.xml -print0 | xargs -0 -n 1 -P 3 bzip2
Run Code Online (Sandbox Code Playgroud)
这个perl程序可以很好地满足您的需求,您只需这样做:
runN -n 4 bzip2 `find . | grep ".xml$"`
Run Code Online (Sandbox Code Playgroud)
如果您今天必须解决这个问题,您可能会使用像 GNU Parallel 这样的工具(除非有专门的并行工具来完成您的任务,例如pbzip2):
find . | grep ".xml$" | parallel bzip2
Run Code Online (Sandbox Code Playgroud)
了解更多: