web-dev-qa-db-ja.com

Python with Flask

私はJQueryとPython Flask Frameworkの下で長いポーリングを行おうとしています。

以前にPHPで長いポーリングを行ったことがあるので、同じ方法でそれを実行しようとしました。

While(true)ループがあり、データベース内の0.5秒ごとなど、定期的に変更をチェックし、変更が発生するとデータを返すスクリプト/関数。

したがって、私のini。pyで、JQueryが呼び出す/ pollへのapp.routeを作成しました。 JQueryはクライアントの現在の状態に関する情報を提供し、poll()関数はこれを現在データベースにあるものと比較します。ループは終了し、変更が観察されると情報を返します。

これがpythonコードです:

@app.route('/poll')
def poll():
client_state = request.args.get("state")

    #remove html encoding + whitesapce from client state
    html_parser = HTMLParser.HTMLParser()
    client_state = html_parser.unescape(client_state)
    client_state = "".join(client_state.split())

    #poll the database
    while True:
        time.sleep(0.5)
        data = get_data()
        json_state = to_json(data)
        json_state = "".join(data) #remove whitespace

        if json_state != client_state:
            return "CHANGE"

問題は、上記のコードがポーリングを開始すると、サーバーが過負荷になり、他のAjax呼び出しが表示され、JQueryを使用してhtmlに「読み込み中」の画像を読み込むなどの他のリクエストが応答せずタイムアウトすることです。

完成させるために、ここにJQueryを含めました。

function poll() {

queryString = "state="+JSON.stringify(currentState);

$.ajax({
    url:"/poll",
    data: queryString,
    timeout: 60000,
    success: function(data) {
        console.log(data);
        if(currentState == null) {
            currentState = JSON.parse(data);
        }
        else {
            console.log("A change has occurred");
        }

        poll();

    },
    error: function(jqXHR, textStatus, errorThrown) {

        console.log(jqXHR.status + "," + textStatus + ", " + errorThrown);

        poll();

    }
});

}

これはマルチスレッドか何かする必要がありますか?または、なぜ私がこの動作を経験しているのか誰かが知っていますか?

前もって感謝します!! :)

9
mickzer

link @Robᵩが述べたように、あなたはflaskアプリは過負荷です。これは、flaskアプリがシングルスレッドモードであるためです。デフォルトでは、app.run()で実行している場合、一度に1つのリクエストしか処理できません。

マルチスレッドは次の方法で開始できます。

if __name__ == '__main__':
    app.run(threaded=True)

または、gunicornやuwsgiなどのWSGIサーバーを使用してflaskマルチプロセッシングでサービスを提供します:

gunicorn -w 4 myapp:app

PythonとFlaskで楽しんでいただければ幸いです!

4
kxxoling