【问题标题】:Python Subprocess Popen Stalling CGI PagePython 子进程 Popen Stalling CGI 页面
【发布时间】:2012-07-04 06:33:22
【问题描述】:

我有一个正在使用的工具,我需要它来运行解析器并输出另一个分析日志。目前我有它,所以它是通过网络界面。

  1. 用户转到表单并提交文件名以进行解析(文件已在系统上)。
  2. 表单向 Python CGI 脚本提交信息
  3. Python CGI 脚本运行并生成一个子进程来运行解析。
  4. 解析器找到适当的信息进行分析并产生子进程。

我正在使用

import subprocess
...
subprocess.Popen(["./program.py", input])

在我的代码中,我从文档中假设我们不等待子进程终止,我们只是继续运行脚本。我的 CGI 脚本启动了这一切:

subprocess.Popen(["./program.py", input])
// HTML generation code
// Javascript to refresh after 1 second to a different page

HTML 生成代码只是输出我们已处理请求的状态,然后 javascript 将页面刷新到主主页。

问题

CGI 页面挂起,直到子进程完成,这不是我想要的。我认为 Popen 不会等待子进程完成,但是每当我运行这个工具时,它都会停止直到完成。我希望脚本完成并让子进程在后台运行并让网页仍然正常运行,而不会让用户认为一切都只是因为加载信号而停滞不前。

我似乎找不到任何 Popen 会这样做的原因,因为我读到的所有地方都说它不等待,但似乎是。

奇怪的是,在脚本完成之前,apache 日志也会显示:“请求正文读取超时”。那么 Apache 真的会停止脚本吗?

抱歉,我无法显示完整的代码,因为它是“机密”,但希望其中的逻辑可以被理解。

【问题讨论】:

    标签: python cgi subprocess


    【解决方案1】:

    不确定为什么会这样,但我遵循了这个帖子中的答案: How do I run another script in Python without waiting for it to finish?

    待办事项:

    p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                         stdout=subprocess.PIPE, 
                         stderr=subprocess.STDOUT)
    

    代替:

    p = subprocess.Popen([sys.executable, '/path/to/script.py'])
    

    由于某种原因,现在 CGI 脚本将终止并且子进程继续运行。 关于为什么存在差异的任何见解都会有所帮助?我不明白为什么必须定义其他两个参数会导致这样的停顿。

    【讨论】:

    • 如果 script.py 生成足够多的输出,它可能会阻塞。将标准输入、标准输出、标准错误重定向到 devnull,exampleclose_fds=True 不会对 POSIX 系统造成伤害。您确定您的代码有效吗?
    • 是的,CGI 脚本不再有加载符号,Apache 日志不再显示“请求正文读取超时”。我同样认为,如果我指定 std 输出会出现一些阻塞,但显然添加这些似乎可以解决它。没有进行其他更改:/
    【解决方案2】:

    Apache 可能会等待子进程完成。您可以尝试妖魔化孩子(双叉,setsid),或者最好将作业提交给本地服务,例如,通过写入预定义文件或使用一些消息代理或通过更高级别的接口(如 celery)

    【讨论】:

    • 谢谢,我想了这么多,然后我早些时候偶然发现了这个线程,现在我决定尝试执行他们对 Popen 的整个命令是值得的:stackoverflow.com/questions/546017/… 并且出于某种原因现在工作。包括 stdout 和 stderr 参数似乎允许脚本结束而不等待子进程。谢谢!
    猜你喜欢
    • 2018-12-05
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2011-08-05
    • 2017-02-03
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多