use*_*986 2 python performance cgi
我拥有一个编写为CGI的遗留python应用程序.到目前为止,这可以正常工作,但并发用户的数量将在不久的将来大幅增加.在这里,我读到:"CGI非常适合低流量网站,但它有其他任何性能问题".我知道以另一种方式开始会更好,但CGI就是现在的样子.
有人能指出我如何保持CGI表现的方向,而不必重写所有代码?
CGI不会扩展,因为每个请求都会分配一个全新的服务器进程.这是一个很大的开销.mod_wsgi通过分配一个进程并将请求交给那个正在运行的进程来避免开销.
让我们假设应用程序是最糟糕的cgi.
最糟糕的情况是它有这样的文件.
my_cgi.py
import cgi
print "status: 200 OK"
print "content-type: text/html"
print
print "<!doctype...>"
print "<html>"
etc.
Run Code Online (Sandbox Code Playgroud)
您可以尝试"包装"原始CGI文件以使其成为wsgi.
wsgi.py
import cStringIO
def my_cgi( environ, start_response ):
page = cStringIO.StringIO()
sys.stdout= page
os.environ.update( environ )
# you may have to do something like execfile( "my_cgi.py", globals=environ )
execfile( "my_cgi.py" )
status = '200 OK' # HTTP Status
headers = [('Content-type', 'text/html')] # HTTP Headers
start_response(status, headers)
return page.getvalue()
Run Code Online (Sandbox Code Playgroud)
这是将CGI应用程序重写为适当框架的第一步.这需要很少的工作,并且会使您的CGI更具可扩展性,因为您不会为每个请求启动新的CGI流程.
第二步是创建mod_wsgiApache使用的服务器而不是所有CGI脚本.该服务器必须(1)解析URL,(2)调用各种函数,如my_cgi示例函数.每个函数都将execfile使用旧的CGI脚本而不需要新的进程.
查看werkzeug以获取有用的库.
如果你的应用程序CGI脚本有一些结构(函数,类等),你可以导入它们并做一些比上面更聪明的事情.这是一个更好的方法.
wsgi.py
from my_cgi import this_func, that_func
def my_cgi( environ, start_response ):
result= this_func( some_args )
page_text= that_func( result, some_other_args )
status = '200 OK' # HTTP Status
headers = [('Content-type', 'text/html')] # HTTP Headers
start_response(status, headers)
return page_text
Run Code Online (Sandbox Code Playgroud)
这需要更多工作,因为您必须了解遗留应用程序.但是,这有两个优点.
它使您的CGI更具可扩展性,因为您没有为每个请求启动新的流程.
它允许您重新考虑您的应用程序,可能将其更改为适当的框架.完成此操作后,下一步并转移到TurboGears或Pylons或web.py以获得非常简单的框架并不是很难.