如何在for循环中使用所有内核

时间:2020-03-24 09:33:44

标签: bash parallel-processing

我有一个脚本来处理目录中的每个文件。 djvu2pdf的每次执行都花费大量时间,并且仅使用我的四个CPU内核之一:

for i in  *.djvu; do djvu2pdf "$i"; done

为了加快总体处理速度,我想并行运行四个djvu2pdf进程。

如何更改我的脚本,使我得到四个管道而不是现在的一个管道?

2 个答案:

答案 0 :(得分:2)

也许分叉将为您解决问题?您可以将处理的主要部分包装到一个函数中,例如这样

topdf() {
    local djvu_file=$1
    djvu2pdf "$djvu_file"
}

for i in  *.djvu; do topdf "$i" & done

如您所见,有一个“&”字符表示该操作应发送到后台。

答案 1 :(得分:1)

使用 GNU Parallel

parallel djvu2pdf ::: *.djvu

默认情况下,它将为每个CPU内核运行一个作业,但是您可以与parallel -j N并行设置更多或更少的作业,其中N是您想要的编号。

您还可以使用parallel --bar ...

获取进度栏。

您还可以执行“空运行” 来查看在不实际使用parallel --dry-run ...

的情况下会做什么。

See also here