2016-12-01 16 views
0

Tornadoでスレッドロックを最小限に抑えるにはどうすればよいですか?実際には、私はすでに作業コードを持っていますが、完全に非同期ではないと思われます。非同期Tornadoコードを最適化します。スレッドロックを最小限にする

私は本当に長い作業をしています。 これは、CouchDBへのいくつかの要求を行い、メタデータを取得し、最終的なリンクを構築することからなる。次に、最後のリクエストをCouchDBにしてファイルをストリームする必要があります(10 MBから100 MBまで)。その結果、大きなファイルがクライアントにストリーミングされます。

大きなファイルをダウンロードする100回の同時リクエストをサーバーが受け取ることができ、スレッドをロックしたり、新しいリクエストを受け取ったりする必要がないという問題(スレッドロックを最小限に抑える必要があります)。

したがって、いくつかの同期要求(requestsライブラリ)を作成してから、大きなファイルをAsyncHttpClientというチャンクでストリームします。

次のような質問は次のとおりです。

1)私がEVERYWHERE AsyncHTTPClientを使用する必要がありますか?私はいくつかのインターフェースを持っているので、すべての同期リクエストを非同期リクエストに置き換えるのにかなりの時間がかかります。それは価値があるのですか?

2)tornado.curl_httpclient.CurlAsyncHTTPClientを使用しますか?コードはより速く実行されますか(ファイルのダウンロード、要求の作成)?

3)Python 3.5asyncに導入されていることがわかりますが、理論的には高速になる可能性があります。非同期を使用するか、デコレータ@gen.coroutineを使用し続ける必要がありますか?

答えて

2

AsyncHTTPClientまたはCurlAsyncHTTPClientを使用します。 「要求」ライブラリは同期型であるため、実行中にTornadoイベントループをブロックし、一度に1つの要求しか進行させることができません。 Tornadoとの非同期ネットワーキング操作を行うには、CurlAsyncHTTPClientのような専用の非同期ネットワークコードが必要です。

はい、CurlAsyncHTTPClientはAsyncHTTPClientよりも少し速いので、大量のデータをストリームするとスピードアップに気づくことがあります。

asyncawaitgen.coroutineyieldよりも高速なので、あなたがタイトループ内で非常に頻繁に実行されるyield文を持っている場合は、コルーチンを呼び出す深くネストされたコルーチンを持っている場合、または、それがポートあなたのコードに価値があるだろう。

関連する問題