从多个 python 子进程捕获输出/也许不是 .communicate() 的更有效方法?

问题描述 投票:0回答:1

我有以下代码块。

cmdTable
是一个字典,其中键是描述要打开的子进程的字符串(如“out_From_hi_mom”),值是可执行命令(如“echo hi mom”)...类似:

cmdTable['himom'] : "echo hi there momma"

这最终构建了

procOutput["himom"] : "hi there momma"

这一切都工作得很好,但我正在启动大约 100 个子进程,并且我试图弄清楚它是否真的在并行运行这些子进程。我非常怀疑事实并非如此,因为 .communicate() 调用旁边的日志始终显示子进程以与它们创建时完全相同的顺序返回。

如果调试时间戳可信,.communicate() 也会批量返回,无论如何,这对我来说似乎不是预期的行为......

我的印象是我或多或少同时启动了一堆子流程。

Popen
调用的时间戳支持这一理论,所有约 100 个调用都在一秒左右的时间内启动。

为了简洁起见,各种

except
块已被删除......

def runShowCommands(cmdTable) -> dict:
    """return a dictionary of captured output from commands defined in cmdTable.    """
    procOutput = {}  # dict to store the output text from show commands 
    procHandles = {}
    for cmd in cmdTable.keys():
        try:
            log.debug(f"running subprocess {cmd} -- {cmdTable[cmd]}")
            procHandles[cmd] = subprocess.Popen(cmdTable[cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    for handle, proc in procHandles.items():
        try:
            procOutput[handle] = proc.communicate(timeout=180)[0].decode("utf-8")  # turn stdout portion into text
            log.debug(f"subprocess returned {handle}")

    return procOutput

我认为值得一提的是,所有这些子进程相对于彼此都是线程安全的,我不关心它们到底以什么顺序运行,并且它们不共享输入或输出状态。我的主要目标是最大限度地减少总挂钟执行时间,并且我有理由确定我错过了一些东西,并且这些都是串行运行而不是并行运行。

Popen
.communicate()
的用法中是否有什么地方我弄错了(我继承了这段代码,并且会坦率地承认它处于我能力的边缘......)

python subprocess
1个回答
0
投票

subprocess.run(args,*,stdin =无,输入=无,stdout =无,stderr =无,capture_output = False,shell = False,cwd =无,超时=无,检查= False,编码=无,错误=无,文本=无,env=无,universal_newlines=无,**other_popen_kwargs)

© www.soinside.com 2019 - 2024. All rights reserved.