使用shell脚本进行多线程处理

时间:2014-12-29 02:36:19

标签: python multithreading bash

我正在使用python脚本在我的图像中执行一些计算,并将获得的数组保存到.png文件中。我处理3000到4000张图像。为了执行所有这些,我在Ubuntu中使用shell脚本。它完成了工作。但无论如何要让它快速。我的机器里有4个核心。如何使用所有这些。我正在使用的脚本位于

之下
#!/bin/bash
cd $1
for i in $(ls *.png)
do
python ../tempcalc12.py $i
done
cd ..

tempcalc12.py是我的python脚本

这个问题可能微不足道。但我真的很喜欢编程。

谢谢

3 个答案:

答案 0 :(得分:3)

xargs--max-procs= ( or -P)选项可以并行执行此任务 以下代码最多可完成4个进程。

ls *.png |  xargs -n 1 -P 4 python ../tempcalc12.py

答案 1 :(得分:1)

你可以添加一个&到python行,让所有内容并行执行:

python ../tempcalc12.py $i &

这是一个坏主意,因为有太多的进程只会减慢一切。 您可以做的是限制线程数,如下所示:

MAX_THREADS=4
for i in $(ls *.png); do
    python ../tempcalc12.py $i &
    while [ $( jobs | wc -l ) -ge "$MAX_THREADS" ]; do
        sleep 0.1
    done
done

每100毫秒,它会检查正在运行的作业的数量,如果它不如MAX_THREADS,则在后台添加新作业。

如果你只想要一个快速工作的解决方案,这是一个很好的黑客,但你可能还想调查GNU Parallel可以做什么。

答案 2 :(得分:0)

如果你有GNU Parallel,你可以这样做:

parallel python ../tempcalc12.py ::: *.png

即使您的PNG有空格,或者#34;,它也会通过每个核心生成一份工作来做正确的事情。在他们中。它还确保不同作业的输出不会混合在一起,因此如果您使用输出,则可以保证您不会从两个不同的作业中获得半个行。

GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在你有ssh访问权限的多台机器上并行运行作业。

如果要在4个CPU上运行32个不同的作业,并行化的直接方法是在每个CPU上运行8个作业:

Simple scheduling

GNU Parallel会在完成后生成一个新进程 - 保持CPU处于活动状态,从而节省时间:

GNU Parallel scheduling

<强>安装

如果没有为您的发行版打包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