Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Multithreading 如何等待并行化的bash命令本身在线程中运行其他任务?(doxygen&;dot)_Multithreading_Bash_Parallel Processing_Doxygen_Dot - Fatal编程技术网

Multithreading 如何等待并行化的bash命令本身在线程中运行其他任务?(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

我在MacOSX上,使用下面的bash脚本在大约10个源代码库上运行doxygen

问题是,doxygen在单独的线程上独自运行最耗时的任务“dot”(创建类图)。这会导致wait命令不等待点线程完成。它实际上会立即将我返回到命令提示符(使用doxygen只创建文档很快),而dot仍在后台生成类图一分钟左右

#!/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本身几乎是立即完成的。