2

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が遅いからですか?

4

2 に答える 2

3

あなたの例はローカルのOSX apacheサーバーでうまく機能しますが、Python CGIをバックエンドソリューションとして使用してajax呼び出しを処理することは非常に非効率的であることをお勧めします。CGI の性質上、リクエストごとにその python スクリプトのプロセスを生成する必要があります。

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

コマンドの呼び出しは、通常、サーバー上で新しく作成されたプロセスの呼び出しを意味します。プロセスを開始すると、出力を生成する実際の作業よりもはるかに多くの時間とメモリが消費される可能性があります。特に、プログラムを解釈またはコンパイルする必要がある場合はなおさらです。コマンドが頻繁に呼び出されると、結果として生じる作業負荷が Web サーバーをすぐに圧倒する可能性があります。
解釈に伴うオーバーヘッドは、Perl やその他のスクリプト言語を使用するのではなく、C/C++ などのコンパイル済み CGI プログラムを使用することで削減できます。プロセスの作成に伴うオーバーヘッドは、FastCGI などのソリューションによって、または mod_php などの拡張モジュールを使用して Web サーバー内でアプリケーション コード全体を実行することによって削減できます。

ローカルでは問題なく機能するかもしれませんが、テストを行うだけで、複数のクライアントを接続して公開すると、さらに影響を受けます。

wsgi (または少なくとも fastcgi) は、古い学校の CGI スクリプトに対するはるかに優れたアプローチです。Apache を使用している場合は、mod_wsgi を使用できます。uwsgigunicorn、および他の多くのアプローチもあります。最終的には、すべてのリクエストに対して呼び出されるスタンドアロンのスクリプトを使用する代わりに、実行中の永続的なプロセスを使用して、リクエストを受け入れ、機能を実行するという考え方です。

最近では、Python を介してサーバー側の Web コードを作成するための学習ステップとして、Python CGI モジュールを使用しているだけだと思います。フレームワークへの移行を検討することをお勧めします。

于 2012-06-04T21:51:52.323 に答える
0

python を cgi として使用する場合、リクエストごとに新しい python iterpreter を開始してリクエストを処理する必要がありますが、これにはプロセス作成のオーバーヘッドが当然含まれます。

イベントごとに新しいリクエストを送信しているためkeyup、バックグラウンドで非常に多くのプロセスが開始されている可能性があります。change代わりにイベントをキャッチするか、リターンが押されたときにのみリクエストを送信する方がよいでしょう。

それ以外の場合は、cgi の代わりにwsgiを使用してスクリプトを実行することをお勧めします。これにより、リクエストごとにインタープリターを再起動する必要がなくなります。

于 2012-06-04T21:56:55.370 に答える