我有一条命令需要大约100ms的时间运行,并且必须多次运行它,而在存储其输出时脚本不会有任何延迟
非并行代码段:
DISCSUBTITLE=$(quodlibet --print-playing "<discsubtitle>")
TITLE=$(quodlibet --print-playing "<title>")
ARTIST=$(quodlibet --print-playing "<artist>")
ALBUM=$(quodlibet --print-playing "<album>")
STATE=$(quodlibet --status)
echo "$DISCSUBTITLE - $TITLE / $ARTIST / $ALBUM"
echo $STATE #actual program does regex processing on $STATE
由于反复调用quodlibet
,因此在我的计算机上花费了大约0.55秒。出于我的预期目的,它太慢了,会导致结结巴巴。
经过一些研究和一些有用的回答,我按速度顺序探索了3种不错的解决方案。
&
,写入临时文件。 #This allows easy changing of file directory and/or name
prefix="/tmp/quodlibet_status_"
quodlibet --print-playing "<discsubtitle>" > $prefix'DISCSUBTITLE' &
quodlibet --print-playing "<title>" > $prefix'TITLE' &
quodlibet --print-playing "<artist>" > $prefix'ARTIST' &
quodlibet --print-playing "<album>" > $prefix'ALBUM' &
quodlibet --status > $prefix'STATE' &
wait
DISCSUBTITLE=$(< $prefix'DISCSUBTITLE')
TITLE=$(< $prefix'TITLE')
ARTIST=$(< $prefix'ARTIST')
ALBUM=$(< $prefix'ALBUM')
STATE=$(< $prefix'STATE')
echo "$DISCSUBTITLE - $TITLE / $ARTIST / $ALBUM"
echo $STATE
这是我选择的解决方案,因为它是最简单,也是最快的。我的SSD花费了约0.16秒,而HDD花费了0.18秒。提速超过3倍。
最初我没有考虑使用临时文件,因为我错误地认为写入磁盘会很麻烦并且会花费太多时间。与其他“日常”磁盘操作相比,这种操作速度要大得多,后者通常需要数兆字节的规模,并且通常还涉及其他操作。
LONG=$(quodlibet --print-playing /
"<discsubtitle|<discsubtitle> - ><title> / <artist> / <album>")
#Upon research & fiddling, I've found that the --print-playing command
#for my program uses substitution when outputting the string similar to
#markup languages, so you can basically print any information
#however you want.
STATE=$(quodlibet --status)
#STATE has to be separate
echo $LONG
echo $STATE
这在我的计算机上花费了大约0.21秒,这是我的后备解决方案。
有所限制,在很大程度上取决于所使用的程序。
. $(which env_parallel.bash)
parset "DISCSUBTITLE TITLE ARTIST ALBUM STATE" ::: \
"quodlibet --print-playing '<discsubtitle>'" \
"quodlibet --print-playing '<title>'" \
"quodlibet --print-playing '<artist>'" \
"quodlibet --print-playing '<album>'" \
"quodlibet --status"
echo "$DISCSUBTITLE - $TITLE / $ARTIST / $ALBUM"
echo $STATE
这在我的机器上花费了大约0.35秒。对我来说并不是很理想,但是从技术上讲还是要不错的利润。
其中一条评论提到它实际上是解决方案1的自动化版本。
答案 0 :(得分:1)
使用临时文件怎么办
cmd1 > out1 &
cmd2 > out2 &
cmd3 > out3 &
cmd4 > out4 &
wait
var1=$(< out1)
var2=$(< out2)
var3=$(< out3)
var4=$(< out4)
echo "$var1 $var2 $var3 $var4"
答案 1 :(得分:0)
也许使用read
,所以您只运行一次cmd
:
read a b c < <(cmd --printA --printB --printC)
根据cmd
的工作方式,您可能不得不摆弄IFS。