相关疑难解决方法(0)

四个并行的任务......我该怎么做?

我在一个目录中有一堆 PNG 图像。我有一个名为 pngout 的应用程序,我运行它来压缩这些图像。这个应用程序是由我做的脚本调用的。问题是这个脚本一次执行一个,如下所示:

FILES=(./*.png)
for f in  "${FILES[@]}"
do
        echo "Processing $f file..."
        # take action on each file. $f store current file name
        ./pngout -s0 $f R${f/\.\//}
done
Run Code Online (Sandbox Code Playgroud)

一次只处理一个文件,需要很多时间。运行此应用程序后,我看到 CPU 仅为 10%。所以我发现我可以将这些文件分成 4 个批次,将每个批次放在一个目录中并从四个终端窗口、四个进程中触发 4 个,所以我有四个脚本实例,同时处理这些图像和工作需要 1/4 的时间。

第二个问题是我浪费了时间分割图像和批处理并将脚本复制到四个目录,打开4个终端窗口,bla bla ...

如何用一个脚本做到这一点,而不必分割任何东西?

我的意思是两件事:首先,我如何从 bash 脚本启动一个进程到后台?(只是在最后加&?) 第二:如何在发送第四个任务后停止向后台发送任务并让脚本等待任务结束?我的意思是,只是在一个任务结束时向后台发送一个新任务,始终保持 4 个任务并行?如果我不这样做,循环将向后台发送无数个任务,CPU 将阻塞。

shell background-process parallelism

25
推荐指数
4
解决办法
2万
查看次数

为什么人们在拥有双核 CPU 时推荐使用 -j3 选项?

在 Gentoo Linux 中,可以设置MAKEOPTS变量/etc/portage/make.conf来告诉make在构建包时它应该并行运行多少作业。因为我有一个双核 CPU,我天真地选择了使用这个-j2选项:一个核心一个工作,所以两者都有事可做。“问题”是有很多参考资料告诉拥有双核 CPU 的用户改为设置该-j3选项。他们之中有一些是:

例如,Gentoo 手册说:

一个不错的选择是系统中的 CPU(或 CPU 内核)数加一,但此指南并不总是完美的。

但是“CPU + 1”规则的基本原理是什么?为什么要加班?

make.conf(5) 手册页甚至说:

建议的设置介于 CPUs+1 和 2*CPUs+1 之间。

我还在make信息页面和make手册页解释中阅读了该-j选项的第 5.4 节(并行执行),但似乎没有答案。

make gentoo

18
推荐指数
3
解决办法
1万
查看次数

一个程序在多个文件上并行执行

我有一个小脚本,它循环遍历文件夹的所有文件并执行(通常是持久的)命令。基本上是

for file in ./folder/*;
do
    ./bin/myProgram $file > ./done/$file
done
Run Code Online (Sandbox Code Playgroud)

(请忽略语法错误,这只是伪代码)。

我现在想同时运行这个脚本两次。显然,如果 ./done/$file 存在,则不需要执行。所以我把脚本改成了

for file in ./folder/*;
do
    [ -f ./done/$file ] || ./bin/myProgram $file >./done/$file
done
Run Code Online (Sandbox Code Playgroud)

所以基本上问题是:两个脚本(或通常不止一个脚本)是否可能实际上处于同一点并检查done失败且命令运行两次的文件是否存在?

这将是完美的,但我非常怀疑。这太容易了 :D 如果他们处理同一个文件可能发生,是否有可能以某种方式“同步”脚本?

scripting shell-script parallelism

8
推荐指数
1
解决办法
9156
查看次数

并行运行多达 X 个命令

我正在运行这样的东西:

find . -maxdepth 1 -type f -note -iname "*.gpg" | sort | while read file ; do
    echo "Encrypting $file..."
    gpg --trust-model always --recipient "me@myself.com" --output "$file.gpg" \
        --encrypt "$file" && rm "$file" 
done
Run Code Online (Sandbox Code Playgroud)

这运行良好,但似乎 GPG 并未优化为使用多核进行加密操作。我正在加密的文件大小约为 2GB,而且我有相当多的文件。我希望能够并行运行 X 个作业来加密文件然后删除它们。我该如何做到这一点,将限制设置为一次 8 个工作?

scripting gpg parallelism

4
推荐指数
1
解决办法
1895
查看次数