【问题标题】:How do I make a spawned process timeout when called from Django?从 Django 调用时,如何使生成的进程超时?
【发布时间】:2012-04-02 12:11:53
【问题描述】:

我在 Python 模块中有以下代码;它使用子进程启动命令行应用程序并读取应用程序写入标准输出的输出。

如果命令行应用程序在 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"

【问题讨论】:

  • 也许 Django 正在一个不同的线程中运行您的代码?中断总是发生在主线程中,可能不是你的代码。

标签: python django signals


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请记住,将select() 与管道一起用于重定向I/O 仅适用于类UNIX 系统,而不适用于Windows,而select() 仅适用于套接字。这可能是也可能不是问题(问题中没有指定操作系统)。
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多