相关疑难解决方法(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万
查看次数

穷人的 GNU Parallel 在 ksh 中实现?

我想使用GNU 并行的功能,它可以并行执行命令和列表,并在完成后将其吐出,但是,我不想在我们所有的服务器上安装 GNU 并行。

或者也许是xargs?

是否有 GNU Parallel 的 ksh 实现?在这种情况下,它不必像 GNU Parallel 那样按顺序完成——只要所有输出都可以通过管道传输或存储即可。我还想避免使用临时文件。

ksh gnu parallelism gnu-parallel

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

有没有办法在 bash 脚本的循环中并行运行进程

可能的重复:
并行化 for 循环

原始代码可能如下所示:

 for i in *; do something.py $i; done
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以在后台并行运行这些作业,例如:

 for i in *; do something.py $i &; done
Run Code Online (Sandbox Code Playgroud)

我试过了,发现&这里不起作用..

此外,更好的方法可能是 bash 允许 8 个作业(或任何数量)在后台队列中一起运行,但我不知道该怎么做...

有没有人对此有想法?谢谢!

bash parallelism

6
推荐指数
1
解决办法
7697
查看次数

标签 统计

parallelism ×3

background-process ×1

bash ×1

gnu ×1

gnu-parallel ×1

ksh ×1

shell ×1