Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用shell脚本的多线程_Python_Multithreading_Bash - Fatal编程技术网

Python 使用shell脚本的多线程

Python 使用shell脚本的多线程,python,multithreading,bash,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 .. tempc12.py是我的python脚本 这个问题可能微不

我正在使用python脚本在图像中执行一些计算,并将获得的数组保存到.png文件中。我处理3000到4000张图像。为了执行所有这些,我在Ubuntu中使用了一个shell脚本。它完成了任务。但无论如何都有办法让它快点。我的机器有4个磁芯。如何使用它们。下面是我正在使用的脚本

#!/bin/bash
cd $1
for i in $(ls *.png)
do
python ../tempcalc12.py $i
done
cd ..
tempc12.py是我的python脚本

这个问题可能微不足道。但我对编程真的很陌生


谢谢

您只需在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
每隔100ms,它将检查正在运行的作业的数量,如果低于MAX_线程,则在后台添加新作业

如果您只是想要一个快速工作的解决方案,那么这是一个很好的解决方案,但您可能还想研究可以做什么。

xargs有-max procs=或-p选项,它可以并行执行此任务。 以下代码最多在4个进程中执行此任务

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

如果您有GNU并行,您可以执行以下操作:

parallel python ../tempcalc12.py ::: *.png
它将通过为每个核心生成一个作业来做正确的事情,即使您的PNG名称中有空格',或在其中。它还确保不同作业的输出不会混合在一起,因此如果使用输出,可以保证不会从两个不同作业中得到半行

GNU Parallel是一个通用的并行程序,它使得在同一台机器上或在您有ssh访问权的多台机器上并行运行作业变得非常容易

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

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

装置

如果您的发行版没有打包GNU Parallel,那么您可以进行个人安装,而不需要root访问。通过执行以下操作,可在10秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有关其他安装选项,请参阅

了解更多

请参阅更多示例:

观看介绍视频:

浏览本教程:

注册电子邮件列表以获得支持: