6

ガンコーンとその非同期ワーカーを使用して長時間実行されるリクエストを処理しようとしていますが、動作する例が見つかりません。ここの例を使用しましたが、応答を返す前に偽の遅延 (5 秒間スリープ) を追加するように微調整しました。

def app(environ, start_response):
    data = "Hello, World!\n"
    start_response("200 OK", [
        ("Content-Type", "text/plain"),
        ("Content-Length", str(len(data)))
    ])
    time.sleep(5)
    return iter([data])

次に、gunicorn を実行します。

gunicorn -w 4 myapp:app -k gevent

2 つのブラウザ タブを開いてhttp://127.0.0.1:8000/両方に入力し、リクエストをほぼ同時に送信すると、リクエストが順番に処理されているように見えます。1 つは 5 秒後に返され、もう 1 つはさらに5 秒後に返されます。

Q. 睡眠はイベントフレンドリーではないと思いますか? しかし、4 つのワーカーがあるため、ワーカーのタイプが「同期」であったとしても、2 つのワーカーが 2 つのリクエストを同時に処理する必要がありますか?

4

3 に答える 3

11

私はちょうど同じことに遭遇し、ここで質問を開きました: Requests not being distributed across gunicorn worker。その結果、ブラウザが同じページへのアクセスをシリアライズしているように見えます。おそらくこれはキャッシュ可能性と関係があると思います。つまり、ブラウザはページがキャッシュ可能である可能性が高いと判断し、ロードしてキャッシュ可能ではないことが判明するまで待ってから、別のリクエストを行います。

于 2014-04-13T05:32:52.223 に答える
1

gevent のようなノンブロッキング ワーカー タイプで gunicorn を使用する場合、リクエストを処理するプロセスは 1 つしか使用しないため、5 秒間の作業が連続して実行されたとしても驚くことではありません。

非同期ワーカーは、ワークロードが軽く、リクエストレートが速い場合に便利です。その場合、gunicorn は、別のワーカーに切り替えることで、IO の待機 (ソケットが書き込み可能になるのを待って応答を書き込むなど) に費やされた時間を利用できます。ワーカーが別のリクエストを処理します。同じワーカーに割り当てられた別のリクエストに切り替えることによって。

アップデート

私は間違っていた。

ノンブロッキング ワーカー タイプで gunicorn を使用し、gunicorn のワーカー設定を使用する場合、各ワーカーは個別のキューを実行するプロセスです。

そのためtime.sleep、別のプロセスで実行された場合は同時に実行されますが、同じワーカーで実行された場合は順次実行されます。

問題は、gunicorn ロードバランサが 2 つのリクエストを 2 つのワーカー プロセスに分散していない可能性があることです。現在のプロセスは で確認できますos.getpid()

于 2014-05-22T11:44:01.297 に答える
1

gevent.sleepの代わりにショットを与えtime.sleepます。

これが で発生しているのは奇妙ですが、これは非同期ワーカー タイプであるため、gunicorn が両方のリクエストを同じクライアントに供給している可能性があります-w 4-k geventそれが起こっていると仮定すると、time.sleepを使用しない限り、プロセスがロックされますgevent.monkey.patch_all()

于 2014-03-18T17:01:38.547 に答える