2

我使用 Django 开发服务器启动一个守护进程,它执行来自views.py 的所有命令,但网页挂起。守护进程正常启动,但需要修复网页挂起。我在 Red Hat Enterprise Linux 6.3 下工作。

为了确保这不是我或我的守护程序错误,我执行了以下测试:

1)我创建了新的 Django 项目“djtesting”,其中创建了一个带有以下代码的 views.py 文件(它启动了 httpd 守护程序):

from django.http import HttpResponse
import subprocess

def hello(request):
    res = subprocess.call("/usr/sbin/httpd")
    return HttpResponse("Testing.")

2) 在 urls.py 中添加这个函数:

from django.conf.urls.defaults import patterns, include, url
from djtesting.views import hello

urlpatterns = patterns('',
    ('^hello/$', hello),
    )

3)然后我用“python manage.py runserver 192.168.1.226:8000”启动网络服务器,并在浏览器中用“ http://192.168.1.226:8000/hello/ ”打开网页。尽管守护程序正常启动,但它显示“测试”消息然后挂起(开始加载并挂起)。但是如果用“/etc/init.d/httpd stop”停止守护进程,网页将停止加载。似乎服务器正在等待守护程序完成工作,但我只需要启动它而不等到它结束。

我尝试了另一种运行守护进程的方法(当然每次尝试一行),但结果同样糟糕:

thread.start_new_thread(os.system, ('/usr/sbin/httpd',))
process = subprocess.Popen("/usr/sbin/httpd", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
res = subprocess.call(["/usr/sbin/httpd", "&"])
res = subprocess.Popen("/usr/sbin/httpd")
res = os.system("/usr/sbin/httpd &")
res = os.spawnl(os.P_NOWAITO, '/usr/sbin/httpd', '&')

我发现了类似的问题,但由于我在 RHEL6.3 下工作,我无法使用 start-stop-daemon: 为什么在底层服务器上启动守护程序后挂起网页?

4

1 回答 1

0

subprocess.call等待返回值,所以我很惊讶您能够获得返回值。尝试subprocess.Popen改用,因为这会产生过程,然后将控制权返回给您,而不是等待结束。

于 2012-10-15T22:34:15.613 回答