python - 子线程中的 I/O 函数调用超时
问题描述
我有一个 Flask-RESTful API (Python 3),我试图让一个函数调用超时,该函数调用运行一个终端命令,该命令执行一个可能需要很长时间才能完成的 C++ 程序。这个函数看起来像这样:
def func(args):
...
result = subprocess.getoutput('./c_program')
...
我搜索了如何执行此操作,发现以下内容: 函数调用超时 我尝试了两种建议的方法,但不幸的是,两者都不起作用。Signal 仅在主线程中工作(我在线程 API 中),并且多处理不会停止 I/O 工作。我一直在寻找,但我只发现提到这两种方法。有谁知道这个问题的任何解决方案?
解决方案
Popen
从subprocess
模块中更好地使用。我还包括了如何终止使用 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())
您可以设置WAIT
为1.5
让该过程完成,在这种情况下,您将看到来自echo
.
推荐阅读
- javascript - Google 脚本作为 2 个单独的脚本工作,但不在同一个函数中
- haskell - 在通用集之上实现键值对映射的查找功能
- rabbitmq - RabbitMQ 如何处理更少的消息更多的消费者?
- c - 在 lldb 中,如何打印位域的结构域
- java - How to count vowels in Java through functional programming?
- reactjs - React Js:防止换行或在文本区域输入时提交
- botframework - 从 Angular 调用我的 .NET Core Teams 机器人
- css - 非常简单的从左到右的 CSS 动画
- html - 如何使用 Ionic 实现夹入/夹出?
- spring-data-jpa - 弹簧数据 JPA。在子表中插入记录时发生异常时父表数据不会回滚