首页 > 解决方案 > 子线程中的 I/O 函数调用超时

问题描述

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

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

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

标签: pythonflask-restful

解决方案


Popensubprocess模块中更好地使用。我还包括了如何终止使用 shell=True 启动的 python 子进程的策略,以解决终止进程的问题:

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())

您可以设置WAIT1.5让该过程完成,在这种情况下,您将看到来自echo.


推荐阅读