Python 为什么os.execvp在apache上阻塞,而在shell上不阻塞?

Python 为什么os.execvp在apache上阻塞,而在shell上不阻塞?,python,Python,我正在寻找一种方法,在纯python中,没有额外的库来启动将在网页返回后运行的后台进程 在shell中,下面的脚本退出,然后打印Hello World。但是,在浏览器中,它会一直阻止,直到完成two.py #!/usr/bin/python import os import sys def run(): program = "python" pid = os.fork() if not pid: os.execvp(program, (program,"

我正在寻找一种方法,在纯python中,没有额外的库来启动将在网页返回后运行的后台进程

在shell中,下面的脚本退出,然后打印Hello World。但是,在浏览器中,它会一直阻止,直到完成two.py

#!/usr/bin/python
import os
import sys

def run():
    program = "python"
    pid = os.fork()
    if not pid:
        os.execvp(program, (program,"two.py"))

run()

print "Content-type: text/html"
print ""
print "Hello, World!"

我不是100%确定,但我认为这是因为Apache不是在等待您的进程,而是在等待您的整个进程组

当您派生一个新流程时,它将继承您的流程组。exec并没有改变这一点。如果要强制将其分离,则必须明确执行此操作,例如,使用:

取决于你的平台,这也可能意味着它会有一个新的会话,这意味着它不再有一个控制终端,但我认为你不会在意这一点


但是,使用库重写two.py可能是更好的设计。然后,无论您如何生成它,它都会处理后台监控本身。在您的脚本中运行它,或者直接从Apache或shell在后台运行它,不管怎样,它都不会让任何人等待它,不会让任何人与终端、僵尸等纠缠在一起。

daemonize起作用了……我本可以将其作为shell脚本来执行,从而节省大量时间。但是我…现在我有了这个生活食谱!
pid = os.fork()
if not pid:
    os.setpgrp()
    os.execvp(program, (program,"two.py"))