【发布时间】:2011-06-19 07:16:13
【问题描述】:
我在从视图调用 subprocess.Popen 时遇到问题: 在子流程完成之前,不会显示调用 subprocess.Popen 的视图。 服务器立即发送“200 OK”,但不发送页面内容。
我的问题是:这是 Django 开发服务器的限制还是我做错了?
服务器没有完全挂起,因为其他视图可以同时处理。
已经有a few questions on that topic,Google 给出了a few other threads,但我找不到我的问题的明确答案。
我相信这不是 python 问题,因为此命令会立即终止:
python -c '导入子进程; print subprocess.Popen(["/bin/sleep", "10"]).pid'
如何重现
创建测试项目和应用:
cd /tmp
django-admin.py 启动项目 django_test
cd django_test
./manage.py startapp subprocess_test
将 urls.py 和 subprocess_test/views.py 替换为:
-
urls.py:
从 django.conf.urls.defaults 导入 *
urlpatterns = 模式('',
(r'^hello$', 'subprocess_test.views.hello'),
(r'^start$', 'subprocess_test.views.start'),
) -
subprocess_test/views.py
从 django.http 导入 HttpResponse
导入子流程
定义你好(请求):
返回 HttpResponse('Hello world!')定义开始(请求):
subprocess.Popen(["/bin/sleep", "10"])
return HttpResponse('开始完成')
测试一下:
./manage.py 运行服务器 0.0.0.0:8000
转到http://127.0.0.1:8000/hello 和http://127.0.0.1:8000/start
测试结果
"start" 需要 10 秒才能加载,在此期间可以加载 "hello"。 比如我得到这样一个日志:
[01/Feb/2011 07:20:57]“GET /hello HTTP/1.1”200 12
[01/Feb/2011 07:21:01] "GET /start HTTP/1.1" 200 10
[01/Feb/2011 07:21:01]“GET /hello HTTP/1.1”200 12
[01/Feb/2011 07:21:02]“GET /hello HTTP/1.1”200 12
使用 wget:
wget http://127.0.0.1:8000/start
--2011-02-01 14:31:11-- http://127.0.0.1:8000/start
正在连接到 127.0.0.1:8000... 已连接。
HTTP 请求已发送,正在等待响应... 200 OK
长度:未指定 [text/html]
保存到:`start'[ <=> ] 10 --.-K/s in 9,5s2011-02-01 14:31:21 (1,05 B/s) - « 开始 » 已保存 [10]
【问题讨论】:
标签: python django subprocess