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
Linux bash多线程/处理小作业_Linux_Multithreading_Bash_Shell_Multiprocessing - Fatal编程技术网

Linux bash多线程/处理小作业

Linux bash多线程/处理小作业,linux,multithreading,bash,shell,multiprocessing,Linux,Multithreading,Bash,Shell,Multiprocessing,我有一个脚本,可以运行一些数据处理命令10K次 foreach f (folderName/input*.txt) mycmd $f end 我已将每个“mycmd$f”的运行时计时为0.25秒。 10公里跑,加起来超过1小时。 我在一台16核的nehalem上运行它。 不在剩下的15个核上运行是一个巨大的浪费 我已经尝试过了&在sleep中,脚本在3900次迭代中会出现警告或错误,请参见下面的内容。睡眠越短,死亡越快 foreach f (folderName/input*.txt)

我有一个脚本,可以运行一些数据处理命令10K次

foreach f (folderName/input*.txt)
  mycmd $f
end
我已将每个“mycmd$f”的运行时计时为0.25秒。 10公里跑,加起来超过1小时。 我在一台16核的nehalem上运行它。 不在剩下的15个核上运行是一个巨大的浪费

我已经尝试过了&在sleep中,脚本在3900次迭代中会出现警告或错误,请参见下面的内容。睡眠越短,死亡越快

foreach f (folderName/input*.txt)
  mycmd $f & ; sleep 0.1
end
一定有更好的办法。 注意:我更喜欢shell脚本解决方案,我们不要走入C/C++领域

谢谢


通过管道将文件列表传送到

xargs -n 1 -P 16 mycmd
例如:

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

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


提交带有批处理的作业
batch
;这将解决负载平衡和资源匮乏问题

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

批处理使用GNU并行,您可以执行以下操作:

parallel mycmd ::: folderName/input*.txt
发件人:

=完全安装=

GNU Parallel的完整安装非常简单:

./configure && make && make install
如果您不是root用户,则可以将~/bin添加到路径并安装到中 ~/bin和~/share:

./configure --prefix=$HOME && make && make install
或者,如果您的系统缺少“make”,您可以简单地复制src/parallel src/sem src/nice将src/sql加载到路径中的一个目录中

=最小安装量=

如果您只需要并行,而没有安装“make”(可能是 系统是旧的或Microsoft Windows):

观看简介视频,快速介绍:

有什么错误?此外,您将使用所有16个内核,除非您以某种自定义方式设置了亲和性。不管[mycmd]实际在做什么,都可能是慢的。这可能是因为您产生了太多的进程。睡眠时间越短,在任何进程完成之前启动的进程就越多。这看起来像是PHP或Perl,而不是Bash。这是什么?同时使用
ls
xargs
可能会导致问题(例如,如果文件名中有空格):
find folderName-maxdepth 1-name'input*.txt'-print0 | xargs-0…
更安全;将
ls
替换为
echo
。我相信仍然可以改进。@tripleee,
echo
并不比
ls
好多少。文件名中的空格仍然存在完全相同的问题。是的,它只是避免了
ls
特有的问题(比如递归到子目录,当然你可以用
ls-d
…或LSD-抱歉,无法抵抗)并保存一个进程,前提是
echo
内置在你的shell中,最初的代码是csh而不是bash,我只是一时糊涂。另外,我的命令将3个参数作为输入。所以我最终使用了xargs-n3-p16mycmd
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/