3

コルーチンの操作を始めたばかりで、geventとgreenletsについて読みました。テストのために、私はgeventspywsgiモジュールを介してこのコードを提供しました。

from gevent.pywsgi import WSGIServer
import gevent

def hello_world(env, start_response):
    gevent.sleep(5)
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<b>hello world</b>"]

print 'Serving on 8088...'
WSGIServer(('127.0.0.1', 8888), hello_world).serve_forever()

テキストが表示される前に、すべてのリクエストで5秒の遅延が発生するという結果を期待していました。ただし、すべてのリクエストはgevent.sleep()の呼び出しでキューに入れられ、最初のリクエストの直後に開始された場合、2番目のリクエストは約10秒かかります。

serve_forever関数は、リクエストごとに新しいグリーンレットを生成しませんか?

4

2 に答える 2

6

リクエストには何を使用していますか?問題はそこにあるのではないかと思います。

私はあなたのコードをab(Apache Benchmark)でテストし、これを取得しました(出力を編集しました):

$ ab -c 200 -n 200 http://localhost:8888/

Completed 100 requests
Completed 200 requests
Finished 200 requests

Concurrency Level:      200
Time taken for tests:   5.048 seconds
Requests per second:    39.62 [#/sec] (mean)
Time per request:       5048.386 [ms] (mean)

abコマンドは、geventサーバーに対して200の同時要求を行います。5秒後、すべてのリクエストが完了しました。ご提案のとおり、リクエストがキューに入れられた場合、このベンチマークには1000秒かかります。

システムがグリーンレットを適切にサポートしていない可能性があると思いますが、テストに使用しているメソッドが各リクエストでブロックしている可能性が高いようです。つまり、サーバーは同時実行性をサポートしていますが、クライアントはサポートしていません。

于 2011-08-18T00:53:24.917 に答える
0

ブラウザは、同じドメインへのリクエストをキューに入れることが知られています。

接続ごとに異なるブラウザ(異なるブラウザウィンドウではなく、実際には異なるアプリケーション(FFやChromeなど))を開いてみてください。

于 2011-08-18T13:27:00.347 に答える