python cgi ajax lag

时间:2012-06-04 21:20:06

标签: python ajax cgi

我使用python脚本用ajax在屏幕上显示文本,但是它有点滞后,有时甚至无法工作..

这是python脚本

#!/usr/bin/env python
import cgi, cgitb
form = cgi.FieldStorage()
q = form.getvalue('q')
print "Content-Type: text/html\n" 
print q

和html

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
        function show(str){
            var xmlhttp;
            if (str.length == 0){
                document.getElementById("hint").innerHTML = "";
                return;
            }
            if(window.XMLHttpRequest){
                xmlhttp=new XMLHttpRequest();
            }
            else{
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange=function(){
                if (xmlhttp.readyState==4 && xmlhttp.status==200){
                    document.getElementById("hint").innerHTML=xmlhttp.responseText;
                }
            }
            xmlhttp.open("GET","../cgi-bin/ajax_test.py?q="+str,true);
            xmlhttp.send();
        }
    </script>
</head>
<body>
    <form action="">
        <input type="text" id="txt1" onkeyup="show(this.value)" />
    </form>
    <span id="hint"></span>
</body>

这是我代码的错吗?还是因为cgi / python很慢?

2 个答案:

答案 0 :(得分:3)

虽然你的示例在本地OSX apache服务器上运行得很好,但我建议使用python CGI作为服务ajax调用的后端解决方案效率非常低。 CGI的本质意味着每个请求都必须生成该python脚本的进程。

http://en.wikipedia.org/wiki/Common_Gateway_Interface

  

调用命令通常意味着调用新创建的命令   服务器上的进程。启动该过程可能会消耗更多时间   和内存比生成输出的实际工作,尤其如此   当程序仍然需要解释或编译时。如果   经常调用命令,生成的工作负载可能很快就会被压倒   网络服务器   可以减少解释中涉及的开销   通过使用编译的CGI程序,例如C / C ++中的程序,而不是   使用Perl或其他脚本语言。涉及的开销   可以通过FastCGI等解决方案减少流程创建   使用完全在Web服务器中运行应用程序代码   扩展模块,如mod_php。

虽然它可以在本地运行得很好,只需要进行测试,当你面向公众时会受到更多的影响,并且有多个客户端连接。

wsgi(或者至少是fastcgi)是一种远远优于旧式CGI脚本的方法。如果您使用的是apache,可以使用mod_wsgi。还有uwsgigunicorn以及我确定的许多其他方法。最终的想法是,不是每个请求都有一个独立的脚本,而是有一个持续的进程正在运行,接受请求和执行函数。

这些天我认为人们只是使用python CGI模块作为通过python编写服务器端Web代码的学习步骤。您可能需要考虑转移到框架。

答案 1 :(得分:0)

当使用python作为cgi时,那么对于每个请求,必须启动一个新的python iterpreter来处理请求,这自然包括创建进程的一些开销。

当您为每个keyup事件发送新请求时,可能会有很多进程在后台启动。最好是捕捉change事件,或者仅在按下返回时发送请求。

除此之外,最好使用wsgi而不是cgi来运行您的脚本,因为这样可以避免在每次请求时重新启动解释器。