【问题标题】:CGI script that runs an executable in the background在后台运行可执行文件的 CGI 脚本
【发布时间】:2012-06-28 04:04:57
【问题描述】:

我有一个向这个 cgi 脚本提交数据的页面,然后这个脚本调用另一个可执行文件。问题是这个可执行文件需要很长时间才能运行,因此,它会导致 cgi 脚本停止直到完成。我正在尝试找到一种在后台运行它的方法。我在linux机器上用python编码。我遇到的问题是当脚本结束时(父进程被杀死),子进程也被 init 终止(根据 linux 规范)。我用谷歌搜索了一下,我遇到了这个线程: Calling an external command in Python

然后我在我的代码中尝试了以下内容:

print <html code>
pid = subprocess.Popen([sys.executable, '/path/to/executable.py '+arg1],
                       stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
                       stdin=subprocess.PIPE)
...
retval = pid.wait()
#For debugging purposes:
print str(retval) + "<br/>"
print </html code>

这给了我一个 '2' 的 retval,我确定这意味着有问题(因为我没有看到正确的输出) 我尝试了其他一些方法,但它要么运行脚本并需要一段时间才能加载(意味着它在前台运行),要么就是无法一起运行脚本。

想法?谢谢你。 哦,顺便说一句,我使用的是 python 2.6

【问题讨论】:

  • 外部进程是做什么的?如果速度很慢,要么缓存结果,要么使用 AJAX 让页面立即加载,完成后数据显示在页面上。
  • 它做了很多数据驱动的计算。它不会更新它所在的即时页面,它会更新显示所有数据的 html 页面。我不在乎页面是否立即更新,我只是不希望它在点击提交按钮时不会挂起。我希望它转到生成后台进程的提交成功页面(python 脚本)
  • 那么在完成输出 HTML 之前,您不想等待子进程完成,因为那会挂起。 wait() 等待孩子结束。 docs.python.org/library/subprocess.html#popen-objects 。另见:docs.python.org/library/…

标签: python subprocess process


【解决方案1】:

解决方案是在脚本完成之前生成一些输出。至于我,最好的方法是使用分块的transfer encoding输出脚本执行日志。

通常,CGI 脚本输出需要在输出开始之前完全生成。这是计算“Content-Length”标头所必需的。分块传输编码可以解决这个问题 - 您不需要知道对输出块的整个响应。

【讨论】:

    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多