我有一个脚本 - 一个线性命令列表 - 需要很长时间才能按顺序运行。我想创建一个实用程序脚本(Perl、Bash 或 Cygwin 上可用的其他脚本),它可以从任何线性脚本读取命令并将它们分配给可配置数量的并行工作人员。
所以如果 myscript
是
command1
command2
command3
我可以跑:
threadpool -n 2 myscript
将创建两个线程,一个从 command1
开始,另一个从 command2
开始。无论哪个线程先完成其第一项工作,都会运行 command3
。
在深入研究 Perl 之前(已经很久了)我想我应该问问专家们是否已经存在这样的东西。我确信应该有这样的东西,因为它对于利用多 CPU 机器和并行网络传输(wget
或 scp
)都非常有用。我想我不知道正确的搜索词。谢谢!
最佳答案
如果您需要不混淆输出(xargs -P
有风险),那么您可以使用 GNU Parallel:
parallel -j2 ::: command1 command2 command3
或者如果命令在文件中:
cat file | parallel -j2
GNU Parallel 是一个通用的并行器,可以很容易地在同一台机器或您可以通过 ssh 访问的多台机器上并行运行作业。
如果您有 32 个不同的作业要在 4 个 CPU 上运行,一个直接的并行化方法是在每个 CPU 上运行 8 个作业:
GNU Parallel 在一个进程完成时生成一个新进程 - 保持 CPU 处于事件状态,从而节省时间:
安装
如果 GNU Parallel 没有为您的发行版打包,您可以进行个人安装,这不需要 root 访问权限。这样做可以在 10 秒内完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有关其他安装选项,请参阅 http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解更多
查看更多示例:http://www.gnu.org/software/parallel/man.html
观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
浏览教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel
关于multithreading - Perl 或 Bash 线程池脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6580191/