如何将Popen对象传递给concurrent.futures.ProcessPoolExecutor

2024-04-20 08:58:43 发布

您现在位置:Python中文网/ 问答频道 /正文

正如您在下面看到的,我有两个并行运行的Popen对象,但在每个进程完成后,我希望使用从每个进程单独接收的数据执行一些后处理任务,但我希望后处理任务并行执行,但我在调用executor.map函数的那一刻就卡住了,我观察到CPU利用率达到100%有一段时间,后来下降了,但没有取得任何结果。 我被无限期地卡住了,进程继续运行。它甚至不在letsee内部打印

subProcess1 = Popen(cmd1, stdout=PIPE, stderr=PIPE, shell=True)
subProcess2 = Popen(cmd2, stdout=PIPE, stderr=PIPE, shell=True)

def letsSee(subProcessId):
    print("Inside letsee")
    while True:
        stdoutVar = subProcessId.stdout.readline()
        if stdoutVar == b'' and subProcessId.poll() is not None:
            break
        if stdoutVar:            
            print(subProcessId, type(stdoutVar), stdoutVar)            
        rc = subProcessId.poll()
    return "Yes"

if __name__ == '__main__':
    with concurrent.futures.ProcessPoolExecutor() as executor:
        print("here")
        xList = [subProcess1, subProcess2]
        print(xList) #output is [<subprocess.Popen object at 0x01365290>, <subprocess.Popen object at 0x01365292>]
        results = executor.map(letsSee, xList)

Tags: truemapif进程stdout后处理printpopen
1条回答
网友
1楼 · 发布于 2024-04-20 08:58:43

你能接受吗

def letsSee(command):
    print("Inside letsee")
    subProcessId = Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
    while True:
        stdoutVar = subProcessId.stdout.readline()
        if stdoutVar == b'' and subProcessId.poll() is not None:
            break
        if stdoutVar:
            print(subProcessId, type(stdoutVar), stdoutVar)
        rc = subProcessId.poll()
    return "Yes"

if __name__ == '__main__':
    with ProcessPoolExecutor() as executor:
        print("here")
        xList = [cmd1, cmd2]
        print(xList)
        results = executor.map(letsSee, xList)

相关问题 更多 >