2011-02-27 116 views
3

我已经建立了一个运行在Fedora 14上的切诺基开发服务器,使用uWSGI与我的WSGI应用程序接口。python subprocess.Popen慢下uWSGI

当应用程序被击中与第一请求,我生成一个进程像这样:

from subprocess import Popen 
Popen(['bash']) # bash is just an example; the problem happens with all programs 

第一请求需要10-15秒来完成(后续者采取少于一秒钟)。 没有创建Popen对象,第一个请求只需要大约2-3秒即可完成。当我从Python shell执行相同的Popen请求时,它是即时的。

什么可能导致此行为?我错过了明显的东西吗?

回答

10

--close-on-exec

否则,如果你喜欢在你的Python代码来处理这一新的进程将继承插座

(这是一种UNIX标准行为)

+0

你能解释一下吗? “继承套接字”是什么意思? (我是这个东西的新手) – Cameron 2011-02-27 06:14:10

+0

刚刚尝试在我的uWSGI XML配置文件中添加''并解决了问题。非常感谢!这似乎是uWSGI的一个未公开的选项 - 但我无法在[docs](http://projects.unbit.it/uwsgi/wiki/Doc)中找到它。它很快就会被添加的任何机会? – Cameron 2011-02-27 06:20:17

+0

http://en.wikipedia.org/wiki/Fork_%28operating_system%29在unix中,每当你产生一个新的进程时,它将得到父进程打开的所有文件描述符。因此,当你在worker中调用Popen时,新进程将继承Web服务器套接字。在这种情况下,直到子流程结束才会关闭连接。 --close-on-exec是在uwsgi --help中报告的,但你是对的,它必须包含在web文档中 – roberto 2011-02-27 06:33:40

3

,你必须通过选项close_fds = True至Popen()那么任何套接字将不会被分叉进程继承。

+0

哦,很高兴知道。谢谢! – Cameron 2011-09-22 22:21:05