我在Python模块中有以下代码;它使用子进程启动命令行应用程序并读取应用程序写入stdout的输出。
如果命令行应用程序在15秒后没有完成,我希望代码超时。我已经使用signal.alarm来尝试实现这一目标。
在没有Django的情况下测试模块时,它会在15秒后按预期超时。但是,当我从Django视图调用代码时,它在15秒后不会超时,但会继续运行,直到生成的进程超时。
我怎样才能做到这一点?
p = get_process() # spawns a process using subproccess and returns the process handle
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(15)
try:
s= p.stdout.read()
except:
p.kill()
s = "Operation timed out"
答案 0 :(得分:1)
This approach,只是产生一个运行子进程的线程并在加入所述线程时使用超时,应该避免在错误的线程中发生中断的任何问题,并且还可以在Windows上运行。
答案 1 :(得分:0)
考虑使用select()
call,它允许您指定I / O操作的超时。