我使用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很慢?
答案 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。还有uwsgi,gunicorn以及我确定的许多其他方法。最终的想法是,不是每个请求都有一个独立的脚本,而是有一个持续的进程正在运行,接受请求和执行函数。
这些天我认为人们只是使用python CGI模块作为通过python编写服务器端Web代码的学习步骤。您可能需要考虑转移到框架。
答案 1 :(得分:0)
当使用python作为cgi时,那么对于每个请求,必须启动一个新的python iterpreter来处理请求,这自然包括创建进程的一些开销。
当您为每个keyup
事件发送新请求时,可能会有很多进程在后台启动。最好是捕捉change
事件,或者仅在按下返回时发送请求。
除此之外,最好使用wsgi而不是cgi来运行您的脚本,因为这样可以避免在每次请求时重新启动解释器。