简体   繁体   中英

subprocess.wait(timeout=15) is not working

Code:

import os
import subprocess


execs = ['C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\Multiof2.exe', # --> Child 1
         'C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\Multiof5.exe', # --> Child 2
         'C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\Multiof10.exe',...] # --> Child 3 and more
print('Parent Process id : ', os.getpid())
process = [subprocess.Popen(exe) for exe in execs]
for proc in process:
    try:
        proc.wait(timeout=15)
        print('Child Process id : ', proc.pid)
        if proc.returncode == 0:
            print(proc.pid, 'Exited')

    except subprocess.TimeoutExpired:
        proc.terminate()
        print('Child Process with pid',proc.pid ,'is killed')

Some Child Processes will take more than 15 sec to execute. So, I have to kill the process which timeout. But proc.wait(timeout=15) is not raising an exception instead it executes the process.

I also tried [subprocess.Popen(exe, timeout=15) for exe in execs] but got Error:

TypeError: __init__() got an unexpected keyword argument 'timeout'

You're not waiting for the processes in parallel - you're giving them each a sequential 15 seconds to do their thing.

You might want something like this to give all of them up to 15 seconds in parallel.

import os
import subprocess
import time


execs = [
    "C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\Multiof2.exe",
    "C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\Multiof5.exe",
    "C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\Multiof10.exe",
]
print("Parent Process id : ", os.getpid())
process = [subprocess.Popen(exe) for exe in execs]
start_time = time.time()
while True:
    elapsed_time = time.time() - start_time
    any_alive = False
    for proc in process:
        ret = proc.poll()
        if ret is None:  # still alive
            if elapsed_time >= 15:
                print("Killing:", proc.pid)
                proc.terminate()
            any_alive = True
    if not any_alive:
        break
    time.sleep(1)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM