Тайм-аут при вызове функции ввода / вывода в дочернем потоке - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть Flask-RESTful API (Python 3), и я пытаюсь тайм-аут вызова функции, которая запускает терминальную команду, которая выполняет программу на C ++, выполнение которой может занять много времени. Эта функция выглядит примерно так:

def func(args):
    ...
    result = subprocess.getoutput('./c_program')
    ...

Я искал, как это сделать, и наткнулся на следующее: Тайм-аут при вызове функции Я попробовал оба предложенных метода, но, к сожалению, ни один не работает. Сигнал работает только в основном потоке (а я в многопоточном API), а многопроцессорная обработка не останавливает работу ввода-вывода. Я продолжал искать, но нашел только упоминание об этих двух методах. Кто-нибудь знает какое-либо решение для этого?

1 Ответ

0 голосов
/ 06 сентября 2018

Лучше использовать Popen из модуля subprocess. Я также включил стратегию из Как завершить подпроцесс python, запущенный с shell = True , чтобы исправить проблемы с завершением процесса:

import os
import signal
import subprocess
import time
from subprocess import PIPE, Popen

p = Popen("sleep 1; echo 1", shell=True, stdout=PIPE, preexec_fn=os.setsid)

WAIT = 0.5

started = time.time()

# do some other work for WAIT seconds:
while time.time() < started + WAIT:
    print("do something else")
    time.sleep(.1)

print("kill")

try:
    os.killpg(
        os.getpgid(p.pid), signal.SIGTERM
    )
except ProcessLookupError:
    # process possibly died already
    pass

print(p.stdout.read())

Вы можете установить WAIT на 1.5, чтобы завершить процесс, в этом случае вы увидите вывод echo.

...