Python Tornado入門

今、Webは大きな場所です。 一度に何千ものクライアントをサポートする必要があり、ここに Tornado が登場しました。 Tornado は Python Web フレームワークおよび非同期ネットワークライブラリで、もともとは FriendFreed で開発されました。 このため、何千ものアクティブなサーバ接続を処理することができます。 これは、長いポーリングと多数のアクティブな接続が維持されるアプリケーションの救世主となります。 WSGI をベースにしていないが、モジュール `tornado.wsgi` を使用して WSGI のいくつかの機能をサポートしている。 Tornado のリクエスト実行をより高速にするイベントループ設計を使用している。

Synchronous Program とは?

関数はブロックし、計算を実行し、完了したら戻ります。 ネットワーク I/O やディスク I/O、ミューテックスなどです。

アプリケーションのパフォーマンスは、アプリケーションがいかに効率的に CPU サイクルを使用するかによって決まりますので、ブロッキング文や呼び出しは真剣に考えなければなりません。 bcrypt のようなパスワード ハッシュ関数について考えてみましょう。 CPU がアイドル状態ではないので、非同期関数を使用する必要はありません。

関数は、1 つではブロッキングで、他ではノンブロッキングにすることができます。 Tornado のコンテキストでは、一般的にネットワーク I/O とディスクによるブロッキングを考慮しますが、すべての種類のブロッキングを最小限に抑える必要があります。

1) シングルスレッド・アーキテクチャ:

つまり、計算中心のタスクを並列に実行できない。

2) I/O 同時実行:

IOタスクをOSに引き渡し、次のタスクに移行して同時実行を実現することができる。

3) epoll/kqueue:

システムが関連する構造を強調し、アプリケーションがファイル記述子または I/O 特定のタスクのイベントを取得できるようにします。

4) イベントループ:

epollまたはkqueueを使ってイベントが発生したかどうかをチェックし、それらのネットワークイベントのために待機しているコールバックを実行します。

同期モデルの場合、各リクエストやタスクはスレッドまたはルーティングに転送され、終了すると呼び出し元に結果が引き渡されます。

一方、Node.js などの非同期フレームワークでは、シングルスレッド モデルがあり、非常に少ないオーバーヘッドですが、複雑さがあります。 今、リクエストが処理されるまで、サーバーは、コールバック結果を実際のクライアントにマップするために、リクエストの状態を効率的に保存および管理する必要があります。

  • Node.js には、そのライブラリがすべて非同期であるという大きな利点があります。 Pythonでは、利用可能なパッケージはたくさんありますが、非同期のものはほとんどありません
  • Node.js は JavaScript ランタイムで、フロントとバックエンドの両方で JS を使用できるので、開発者は一つのコードベースだけを維持し、同じユーティリティライブラリを共有できます
  • Google の V8 エンジンにより Node.js は Tornado より高速になりました。 しかし、多くの Python ライブラリは C で書かれており、より速い代替になりえます。

A Simple ‘Hello World’ Example

CODE: https://gist.github.com/velotiotech/b4d91554b739f2487bf6131ac65ec06d.js

注意: この例では、非同期機能は使用していません。

AsyncHTTPClient モジュールを使用すると、非同期に REST コールを行うことができます。 https://gist.github.com/velotiotech/5fe63eb5fd6cf3af9bf353c2fd3b4ca7.js

ご覧のように、`yield http_client.fetch(url)` はコルーチンとして実行されます。

Tornado Async の複雑な例

Asynchronous Request handler を見てください。

Tornado を使用した WebSockets:

Tornado には、並行処理を実現するためにコルーチンで簡単に使用できる WebSockets のパッケージが組み込まれており、以下はその一例です。 https://gist.github.com/velotiotech/34d0a0e0ecd57818ae1db1697c075777.js

サーバーに接続するために WebSocket クライアントアプリケーションを使用することができ、メッセージは任意の整数とすることができます。 処理後、クライアントは整数が素数であるかどうかの結果を受け取ります。
ここで、Tornado の非同期機能の実際の例をもう 1 つ紹介します。

この例では、ワーカーを起動することができ、それらは ‘tornado.queue’ をリッスンすることになります。 このキューは非同期であり、asyncio パッケージに非常によく似ています。 https://gist.github.com/velotiotech/1477131948ca23879167df0281726d02.js

Conclusion

1) 非同期フレームワークは、ほとんどの計算が CPU 中心で I/O 中心でない場合はあまり使用しません。

2) コアモデルおよびイベントループごとに 1 つのスレッドがあるため、アクティブなクライアント接続の数千を管理できます。

3) Django が大きすぎるとか Flask が小さい、Tornado はちょうどいいと多くの人は言います:)

コメントを残す

メールアドレスが公開されることはありません。