I/O 子线程中的函数调用超时
Timeout in I/O function call in child thread
我有一个 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
的输出。
我有一个 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
的输出。