2016-11-14 1 views
0

私は基本的にcoroutines in Tornadoを理解しています。これは、特に、完了するまでにかなりの時間を要する同時リクエストを処理するという点で、APIサーバーの拡張に役立つはずです。しかし、単純なロードテストでは、コルーチンを使用するのは実際には単純なブロッキング関数呼び出しを使用するよりも悪いようです...竜巻はコルーチンと比べて悪いですか?

以下は、負荷テストの同時実行レベル4を使用したAPI応答時間を示す2つのスクリーンショットです4つのイナゴまたは「ユーザー」)。/v1エンドポイントは単純なブロッキング関数呼び出しを使用し、/ v2エンドポイントはtornado.gen.coroutineを使用します。私はGET/v2/infoの平均応答時間がGET/v1/infoの平均応答時間よりも大幅に遅くなると予想しましたが、実際には平均応答時間は,です。

GET /v1/info with 4 locusts

GET /v2/info with 4 locusts

私はどちらか何か間違ったことや基本的な概念を誤解してるような気がします。誰かが私のサンプルプロジェクトが上記の数字を表示している理由を教えてもらえますか?コルーチンベースのAPIが、シンプルなAPIよりも並行負荷の方が悪い場合

サンプルtornado-loadtestプロジェクト:https://github.com/martyychang/tornado-loadtest

答えて

1

あなたのコルーチンがここに非同期何もしていませんので、コルーチンデコレータは、厳密にオーバーヘッドです。 @coroutineデコレータは、yieldを使用して他のコルーチンまたはその他の非同期操作を待機している場合にのみ便利です。この場合、あなたがやっている遅いことはCPUに依存しているので、コルーチンでうまく動作させるためにできる唯一のことは、yield thread_pool_exector.submit(task)のスレッドで実行しますケース、Python GILのおかげで)。コルーチンは、あなたのプログラムがIOバウンドのとき、または外部イベント(「リアルタイム」ウェブアプリ)のために接続を開いているときに役立ちます。

+0

情報をいただきありがとうございます。だから私はあなたの答えを正しく理解しています:メモリ内の計算をする代わりに、インターネットから大規模ファイルをダウンロードするのが遅い場合、コルーチンが役立つでしょうか? –

+0

はい、そうです。 –

関連する問題