Python的子进程POPEN失速CGI页面(Python Subprocess Popen Sta

2019-06-26 00:29发布

我有一个工具,我在工作,我需要它来运行一个分析器,并输出另一个分析日志。 目前,我有它,以便它是通过一个网络接口。

  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实际上拖延脚本呢?

对不起,我不能显示完整的代码,因为它是“机密”,但希望的逻辑是存在的理解。

Answer 1:

Apache的大概等待子进程完成。 你可以尝试妖魔化孩子(双叉,setsid)或更好的只是将作业提交到本地服务例如,通过写一个预定义的文件,或者使用一些消息代理,或通过更高级别的接口,如芹菜



Answer 2:

不知道到底为什么这工作,但我跟着这个线程的答案: 我如何运行在Python另一个脚本,而不必等待它完成?

去做:

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脚本将会终止,子进程继续运行。 任何了解,为什么是有区别的将是有益的? 我不明白为什么有定义其他两个参数会导致这样的摊位。



文章来源: Python Subprocess Popen Stalling CGI Page