Multithreading 如何等待并行化的bash命令本身在线程中运行其他任务?(doxygen&;dot)
我在MacOSX上,使用下面的bash脚本在大约10个源代码库上运行doxygen 问题是,doxygen在单独的线程上独自运行最耗时的任务“dot”(创建类图)。这会导致wait命令不等待点线程完成。它实际上会立即将我返回到命令提示符(使用doxygen只创建文档很快),而dot仍在后台生成类图一分钟左右Multithreading 如何等待并行化的bash命令本身在线程中运行其他任务?(doxygen&;dot),multithreading,bash,parallel-processing,doxygen,dot,Multithreading,Bash,Parallel Processing,Doxygen,Dot,我在MacOSX上,使用下面的bash脚本在大约10个源代码库上运行doxygen 问题是,doxygen在单独的线程上独自运行最耗时的任务“dot”(创建类图)。这会导致wait命令不等待点线程完成。它实际上会立即将我返回到命令提示符(使用doxygen只创建文档很快),而dot仍在后台生成类图一分钟左右 #!/bin/bash DOXY="/Applications/Doxygen.app/Contents/Resources/doxygen" #run doxygen on all c
#!/bin/bash
DOXY="/Applications/Doxygen.app/Contents/Resources/doxygen"
#run doxygen on all configs
for config in doxygen*.config
do
$DOXY $config &
done
wait
我曾尝试在单个线程(dot_NUM_THREADS=1)上强制运行dot,但没有效果。我试着将wait命令放入循环中,但这只会让doxygen在没有并行化的情况下花费相同的时间,而且仍然不会等待dot完成
我需要等待dot命令生成所有类图,否则我将在下一步打包/上传不完整的文档
如何并行化doxygen并让它等待所有线程化的点命令完成?
或者,是否有一种方法可以让我在bash脚本中确定是否所有的点命令都已结束(我不知道doxygen实际生成了哪些进程/线程,也不知道如何等待它们)
更新:
我尝试使用xargs,它会正确地等待所有点线程完成,但不会更快:
find . -name "doxygen*.config" | xargs -n 1 -P 8 doxygen
这里的问题是,我无法将“n”(数字)设置为大于1,因为doxygen不会创建所有文档集,因为它会忽略其他参数。我找到了一个解决方案。但首先,我是个傻瓜,竟然相信我能加速强氧。我已经提到过,doxygen是线程处理最耗时的任务(dot)。所以:嗯!:) 无论如何,对我有效的是使用doxygen命令创建另一个bash脚本:
#!/bin/bash
DOXY="/Applications/Doxygen.app/Contents/Resources/doxygen"
echo Making $1 …
$DOXY $1
然后原始bash脚本可以并行化任务,并正确地等待dot完成:
#!/bin/bash
#run doxygen on all configs
for config in doxygen*.config
do
./make-doc.sh $config &
done
wait
看看这里,我描述了一种使用标记文件和GNU并行实用程序并行运行doxygen的方法。我认为另一种解决方案(没有测试,因为我没有安装doxygen
),就是在后台的子shell中作为前台任务运行doxygen
。这与您找到的解决方案基本相同,但不需要创建第二个脚本:
for config in doxygen*.config; do
( $DOXY $config ) &
done
wait
这是一个很好的方法,但似乎不适用于我的情况。99%的时间都用dot创建图像在我的例子中,doxygen本身几乎是立即完成的。