从Django调用时如何使生成的进程超时?

时间:2012-04-02 12:11:54

标签: python django signals

我在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"

2 个答案:

答案 0 :(得分:1)

This approach,只是产生一个运行子进程的线程并在加入所述线程时使用超时,应该避免在错误的线程中发生中断的任何问题,并且还可以在Windows上运行。

答案 1 :(得分:0)

考虑使用select() call,它允许您指定I / O操作的超时。