有没有办法区分未完成和被阻止波本.波尔()

2024-09-26 18:17:00 发布

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

我想“播种”一些过程,然后“收获”他们当他们完成。使用subprocess模块,我在subrun.py中有以下代码:

import time, subprocess, shlex, os

ok = subprocess.Popen(shlex.split("python ok.py"),
                      stdout=subprocess.PIPE,
                      stderr=open(os.devnull, 'w'))


nok = subprocess.Popen(shlex.split("python nok.py"),
                       stdout=subprocess.PIPE,
                       stderr=open(os.devnull, 'w'))

procs = {'ok': ok, 'nok': nok}

while procs:
    running = procs.keys()
    print "running:", running
    for k in running:
        proc = procs[k]
        rc = proc.poll()
        if rc is None:
            pass  # still running
        else:
            del procs[k]
            print proc.stdout.read()

    time.sleep(.4)

ok.py如下

import sys
print "OK"
sys.exit(0)

nok.py

import sys
print "NOK" * 5000
sys.exit(0)

输出为

(dev) C:\work\dev\test>python subrun.py
running: ['ok', 'nok']
running: ['ok', 'nok']
OK

running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
Traceback (most recent call last):
  File "subrun.py", line 27, in <module>
time.sleep(.4)

当子进程在IO上被阻塞时,即Popen.poll()返回None。你知道吗

我可能会为每个进程启动一个线程,这将调用.communicate()[0],但这似乎需要很多额外的簿记。。。你知道吗

有什么办法可以让它发挥作用吗?你知道吗


Tags: pyimporttimeosstdoutsysokrunning
1条回答
网友
1楼 · 发布于 2024-09-26 18:17:00

如果设置stdout=PIPE,那么应该读取管道,否则如果子进程生成足够的输出,它可能会永远阻塞。你知道吗

这是代码中的一个bug。修好它。你知道吗


要在子进程完成后获取所有输出,请执行以下操作:

#!/usr/bin/env python
import shlex
from multiprocessing.dummy import Pool
from subprocess import check_output

cmds = map(shlex.split, ["python ok.py", "python nok.py"])
outputs = Pool(len(cmds)).map(check_output, cmds)

相关问题 更多 >

    热门问题