Linux bash多线程/处理小型工作

时间:2012-06-02 00:35:23

标签: linux multithreading bash shell multiprocessing

我有一个运行一些数据处理命令10K次的脚本。

foreach f (folderName/input*.txt)
  mycmd $f
end

我已将每个“mycmd $ f”的运行时间定为0.25秒。 通过10K运行,它总计超过1小时。 我在16核nehalem上运行它。 如果不在其余15个核心上运行,那将是一个巨大的浪费。

我试过&有了睡眠,不知何故,脚本会在3900次迭代时死于警告或错误,见下文。睡眠时间越短,死亡的速度越快。

foreach f (folderName/input*.txt)
  mycmd $f & ; sleep 0.1
end

必须有更好的方法。 注意:我更喜欢shell脚本解决方案,让我们不要徘徊在C / C ++领域。

由于

此致

4 个答案:

答案 0 :(得分:6)

将文件列表传送到

xargs -n 1 -P 16 mycmd

例如:

echo folderName/input*.txt | xargs -n 1 -P 16 mycmd

答案 1 :(得分:1)

使用以下应用程序之一可能还有其他一些解决方案:

xjobs

Parallel

PPSS - Parallel Processing Shell Script

runpar.sh

答案 2 :(得分:0)

使用batch提交作业;这应该可以解决负载平衡和资源匮乏问题。

for f in folderName/input.*; do
    batch <<____HERE
        mycmd "$f"
____HERE
done

(不是100%确定报价是否正确和/或有用。)

答案 3 :(得分:0)

使用GNU Parallel,您可以:

parallel mycmd ::: folderName/input*.txt

来自:http://git.savannah.gnu.org/cgit/parallel.git/tree/README

=完全安装=

完全安装GNU Parallel非常简单:

./configure && make && make install

如果您不是root用户,可以在路径中添加〜/ bin并安装 〜/ bin和〜/ share:

./configure --prefix=$HOME && make && make install

或者,如果您的系统缺少“制作”。你可以简单地复制src / parallel src / sem src / niceload src / sql到你路径中的一个目录。

=最小安装次数=

如果你只是需要并行而没有制作&#39;安装(也许是 系统是旧的或Microsoft Windows):

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
mv parallel sem dir-in-your-$PATH/bin/

观看介绍视频以获得快速介绍: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1