子线程中的I / O函数调用超时

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

我有一个Flask-RESTful API(Python 3),我正在尝试超时运行终端命令的函数调用,该命令执行可能需要很长时间才能完成的C ++程序。这个函数看起来像这样:

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

我搜索了如何做到这一点,我发现了以下内容:Timeout on a function call我尝试了两种建议的方法,但不幸的是都没有工作。信号仅在主线程中工作(我在线程API中),并且多处理不会停止I / O工作。我一直在寻找,但我只发现了这两种方法。有谁知道任何解决方案吗?

python flask-restful
1个回答
2
投票

更好地使用Popen模块中的subprocess。我还包括来自How to terminate a python subprocess launched with 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的输出。

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