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

标签 python flask-restful

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

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

我搜索了如何执行此操作,发现了以下内容: Timeout on a function call 我尝试了两种建议的方法,但不幸的是都不起作用。 Signal 只在主线程中工作(我在线程 API 中),并且多处理不会停止 I/O 工作。我一直在寻找,但只发现提到这两种方法。有谁知道这个问题有什么解决办法吗?

最佳答案

最好使用 subprocess 模块中的 Popen。我还包括了 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 的输出。

关于python - 子线程中I/O函数调用超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52209563/

相关文章:

python - 使用opencv用另一个填充空白图像

用于任务管道的 Python 模式

python - 无法在其他文件中导入 mongo 对象

python-3.x - flask_jwt_extended 在解码我的 JWT 时抛出错误。我怎样才能捕捉到它?

python - Flask API 无法解码 JSON 数据。错误: "message": "Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)"

python - pytz 本地化与日期时间替换

Python 和 scikit 学习 : replace matrix vector product during training with custom call

python - lxml 和 ElementTree 有什么区别?

flask - 寻找使用Flask API发送TCP重置以发送选择性URL的方法

flask - 部署到 Elastic Beanstalk 的 Flask 应用程序的任何路由上的 404