首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python cgi性能

Python cgi性能
EN

Stack Overflow用户
提问于 2009-06-19 01:26:02
回答 2查看 3.4K关注 0票数 2

我拥有一个写成CGI的遗留python应用程序。到目前为止,这种方法工作正常,但在不久的将来,并发用户的数量将大幅增加。在这里,我读到:"CGI对于低流量的网站是很好的,但它对于其他任何东西都有一些性能问题“。我知道以另一种方式开始会更好,但CGI就是现在的样子。

谁能告诉我如何在不重写所有代码的情况下保持CGI的性能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-19 02:46:31

CGI不能伸缩,因为每个请求都会派生一个全新的服务器进程。这是很大的开销。mod_wsgi通过派生一个进程并将请求交给那个正在运行的进程来避免开销。

让我们假设应用程序是最糟糕的cgi类型。

最糟糕的情况是它有这样的文件。

my_cgi.py

代码语言:javascript
运行
AI代码解释
复制
import cgi
print "status: 200 OK"
print "content-type: text/html"
print
print "<!doctype...>"
print "<html>"
etc.

您可以尝试“包装”原始CGI文件,使其成为wsgi。

wsgi.py

代码语言:javascript
运行
AI代码解释
复制
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()

这是将您的CGI应用程序重写为适当框架的第一步。这只需要很少的工作,并且将使您的CGI更具可伸缩性,因为您不会为每个请求启动一个新的CGI进程。

第二步是创建Apache使用的mod_wsgi服务器,而不是所有的CGI脚本。此服务器必须(1)解析URL,(2)调用各种函数,如my_cgi示例函数。每个函数都会execfile旧的CGI脚本,而不会派生新的进程。

werkzeug上查找有用的库。

如果您的应用程序CGI脚本具有某种结构(函数、类等)你可以导入这些代码,然后做一些比上面更聪明的事情。一种更好的方法是这样。

wsgi.py

代码语言:javascript
运行
AI代码解释
复制
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

这需要更多的工作,因为您必须了解遗留应用程序。然而,这有两个优点。

  1. 它使你的CGI更具伸缩性,因为你不需要为每个请求启动一个新的进程。
  2. 它允许你重新考虑你的应用程序,可能会改变它到一个合适的框架。一旦你做到了这一点,进入下一步并转移到TurboGearsPylonsweb.py以获得一个非常简单的框架就不是很难了。
票数 6
EN

Stack Overflow用户

发布于 2009-06-19 01:29:14

使用FastCGI。如果我理解正确的话,您可以通过编写一个非常简单的FastCGI程序来做您想做的事情,该程序位于web服务器和您的遗留代码之间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1017087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文