python - 使用 GNU parallel 并行化 bash for 循环

标签 python unix gnu-parallel

我有一个 for 循环,它在 100 个不同的输入文件夹上运行 Python 脚本约 100 次。 python 脚本在 2 个内核上效率最高,我有 50 个内核可用。所以我想使用 GNU parallel 一次在 25 个文件夹上运行脚本。

这是我的 for 循环(工作正常,但当然是顺序的),python 脚本采用一堆输入变量,包括在两个内核上运行它的 -p 2:

for folder in $(find /home/rob/PartitionFinder/ -maxdepth 2 -type d); do
        python script.py --raxml --quick --no-ml-tree $folder --force -p 2
done

这是我对其进行并行化的尝试,但行不通:

folders=$(find /home/rob/PartitionFinder/ -maxdepth 2 -type d)

echo $folders | parallel -P 25 python script.py --raxml --quick --no-ml-tree {} --force -p 2

我遇到的问题(也许这只是众多问题中的第一个)是我的 folders 变量不是列表,所以它实际上只是传递一长串 100 个文件夹作为 {} 到脚本。

感谢收到所有提示。

最佳答案

替换 echo $folders |并行...echo "$folders"|并行...

如果没有双引号,shell 会解析 $folders 中的空格并将它们作为单独的参数传递给 echo,从而使它们打印在一行上。 parallel 提供每一行作为作业的参数。

为了完全避免此类引用问题,最好将 find 直接通过管道传递给 parallel,并使用空字符作为分隔符:

find ... -print0 | parallel -0 ...

即使遇到包含多个空格或换行符的文件名,这也会起作用。

关于python - 使用 GNU parallel 并行化 bash for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44367508/

相关文章:

linux - shell 脚本 : sed command is ignoring INFO lines given main 2>&1

bash - 如何在 Unix 中同时写入文件和打印到终端?

bash - 使用 GNU parallel 拆分命令行参数

gnu-parallel - 将多个参数传递给 GNU 并行

python - 在Mac上的pandas中打开csv文件时出现utf-8错误

python - wxpython中的wxThumbnailCtrl如何使用?

python - 在 python 2.7 上安装 PySide2

python - Flask-admin,编辑关系给我外键对象的对象表示

linux - 检测 stdout 是否被重定向到管道(而不是文件、字符设备、终端或套接字)?

linux - GNU 并行负载均衡