2012-07-03 34 views
3

我有一个我正在使用的工具,我需要它来运行解析器并输出另一个分析日志。目前我拥有它,所以它通过网络界面。Python子流程Popen失速CGI页面

  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是​​否真的拖延了脚本呢?

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

回答

1

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

+0

谢谢,我想了很多,然后我很早就偶然发现了这个线程,现在我决定尝试去完成他们对Popen的全部命令:http://stackoverflow.com/questions/546017/how -do-i-run-another-script-in-python-without-wait-for-it-to-finish由于某种原因,它现在可以工作。包括stdout和stderr参数似乎允许脚本结束,而不是等待子进程。谢谢! – richardhsu

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脚本将终止并且子进程继续运行。 任何有关为什么有差异的见解会有帮助吗?我不明白为什么必须定义其他两个参数会导致这样的失速。

+0

如果script.py生成足够的输出可能会阻塞。将stdin,stdout,stderr重定向为devnull,[示例](http://stackoverflow.com/a/11270665/4279)。 'close_fds = True'在POSIX系统上不会受到伤害。你确定你的代码有效吗? – jfs

+0

是的,CGI脚本不再具有加载符号,并且Apache日志不再显示“请求正文读取超时”。我认为同样的,如果我指定了标准输出,但是显然添加了那些似乎可以修复它的东西,会有一些阻塞。没有做其他更改:/ – richardhsu