この記事を読んでのエントリの竜巻は、非常によく書かれました:
https://zhuanlan.zhihu.com/p/37382503
トルネードは非ブロッキングネットワークI / Oを使用してPythonのWebフレームワークライブラリと非同期ネットワークであり、
トルネードは主に4つの部分に分けることができます:
- Webフレームワーク
- 達成するためのHTTPクライアントとサーバー
- 非同期ネットワークライブラリ
- コルーチンライブラリー
WSGIは、Webサーバーのゲートウェイインターフェイスの頭字語です。
ウェブは、ユーザごとに長い接続がアイドル状態のほとんどの時間を提供するために必要な特長リアルタイム、ユーザーごとにスレッドを提供することを意味し、従来の同期のWebサーバーで、当然のことながら、各スレッドのコストは非常に高価です。
同時接続によって引き起こされるオーバーヘッドを最小にするために、トルネードが使用シングルスレッドのイベントループこれは、すべてのアプリケーションコードがなければならないことを意味する。モードを非ブロッキング非同期、 一方のみが有効であると同時に動作するからです。
ほとんどのバックエンドと手相は、このフレームワークを採用する必要があります知っています。
以下)は簡易ヘルプ・リコールコード:(パイコンピューティング・サービスを提供しています
#1 pi.pyの インポートJSON インポート数学 インポートRedisのが インポートtornado.ioloop インポートtornado.webの クラスFactorialService(オブジェクト): デフ __init__ (自己、キャッシュ): self.cache = キャッシュ self.key = " 階乗" DEF CALC(自己、N- ): S = self.cache.hget(self.key、STR(N)) であればS: 戻り真INT(S)、 S = 1 のために私に範囲(1 、N): だ * = iは self.cache.hset(self.key、STR(n)は、STR(S)) リターンS、偽 クラスPiService(オブジェクト): デフ __init__ (自己、キャッシュ): セルフ.cache = キャッシュ self.key = " PIS " DEF CALC(自己、N): S = self.cache.hget(self.key、STR(N)) であればS: 戻りフロート(s)は、真の S = 0.0 のために I における範囲(N): S+ = 1.0 /(2 * I + 1)/(2 * I + 1 ) S = math.sqrt(S * 8 ) self.cache.hset(self.key、STR(n)は、STR(S)) リターンS、偽 クラスFactorialHandler(tornado.web.RequestHandler): DEF :(自己、階乗)を初期化 self.factorial = 階乗 デフのget(自己): N = INT(self.get_argument(" N ")、または 1 ) 事実、キャッシュされたが = self.factorial.calc(n)の 結果 = { " N " :N、 " 事実" :実際には、 " キャッシュ" :キャッシュされ } self.set_header(" コンテンツタイプ"、" アプリケーション/ JSON;のcharset = UTF-8 " ) self.write(json.dumps(結果)) クラスPiHandler(竜巻。 web.RequestHandler): デフを初期化(自己、PI): self.pi = piは デフ自己(取得): N = INT(self.get_argument(" N ")、または 1 ) PI、キャッシュされました =self.pi.calc(N) 結果 = { " N " :nは、 " PI " :PI、 " キャッシュ" :キャッシュされ } self.set_header(" コンテンツタイプ"、" アプリケーション/ JSON;のcharset = UTF-8 " ) self.write(json.dumps(結果)) DEF make_app(): キャッシュ = redis.StrictRedis(" ローカルホスト"、6379 ) 階乗 = FactorialService(キャッシュ) PI = PiService(キャッシュ) を返すtornado.web.Application([ (R " /事実"、FactorialHandler、{ " 要因" :階乗})、 (R " / PI "、PiHandler、{ " PI " :PI}) ] ) であれば __name__ == " __main__ " : アプリ = make_app() app.listen( 8888 ) tornado.ioloop.IOLoop.current())(開始。
2つのRedisのハンドラを使用する必要があるため、私たちは、パラメータを渡し、それを分離のRedisます。さらにハンドラ初期化関数のパラメータは、任意のパラメータを渡すことができる辞書登録ルート、および辞書のためのキーと対応するパラメータ名を渡すことができます。我々は実行しpython pi.py
、ブラウザアクセスを開いてhttp://localhost:8888/pi?n=200
、ブラウザの出力を見ることができ{"cached": false, "pi": 3.1412743276, "n": 1000}
、この値が既に円周の比率に非常に近いです、。
以下:(ほとんど非常によく書かれたから知っています)
https://zhuanlan.zhihu.com/p/37382503
トルネード:こんにちは、世界
輸入tornado.ioloop 輸入tornado.webの クラスMainHandler(tornado.web.RequestHandler): デフを取得(自己): self.write(" こんにちは、世界" ) デフmake_app(): 返すtornado.web.Application([ (Rを" / "MainHandler) ])であれば__name__ == " __main__ " : アプリ = make_app() app.listen( 8888 ) 。tornado.ioloop.IOLoop.current())(開始
これは、公式のHello、Worldの例で、実行するためにpython hello.py
HTTPにアクセスするには、ブラウザを開くには、:// localhostを:8888 /ノーマル出力サーバを見ることができますHello, world
。
通常の竜巻のWebサーバーは、通常、4つのコンポーネントで構成されています。
- エンジンは、コアサーバでインスタンスioloop、それはグローバル竜巻イベントループで、例は、
tornado.ioloop.IOLoop.current()
インスタンスioloopデフォルト竜巻です。 - アプリのインスタンスは、それは完全なバックエンドアプリを表し、それがサービスを提供するサーバソケットポートをマウントします。ioloopアプリの複数のインスタンスを有することができる例には、一つだけのサンプル、実際には、複数の可能かもしれないが、複数のは、一般的にほとんど使用されません。
- 私たちが行ったビジネスロジックを表しハンドラクラスは、ときに、サービスクライアントの要求にサービスハンドラ側の開発の山を書くことです。
- ルーティングテーブル、そしてそれがルートマップを形成するために、添付のURLルールハンドラを指定します。リクエストが来た場合、適切なサービス・ハンドラを見つけるために、アクセス要求のURLクエリのルートマップに応じて。
これらの四つの成分との間の関係は、ルーティングテーブルは、複数のハンドラが含まれ、アプリケーションは、ルーティングテーブルを含む、ioloopは、(複数のサービスポート管理)複数のアプリケーションを含んでいます。ioloopは、それが受信して内部サーバタイミングタスクを実装するための責任あるビジネスを、実行するためのハンドラを駆動するための責任がクライアントの要求に応答する責任エンジン、で、エンジンのコアサービスです。
リクエストが来た場合、要求を読んioloop httpリクエストオブジェクトはソケットのルーティングテーブル上の対応するアプリを見つけることです解凍し、クエリ要求のURLオブジェクトによって、ルーティングテーブルは、ハンドラを実行し、ハンドラをマウント。実行ハンドラメソッドは、通常のオブジェクトを返した後、クライアントに送信された標的配列のHTTPレスポンスにオブジェクトをパッケージ化するための責任ioloop。
ioloopインスタンスとシングルスレッド環境で実行されています。
ioloopについて:
tornado.ioloop -メインイベントループ
アンI / Oのためのイベントループノンブロッキングソケット(ソケットインタフェースをノンブロッキング)。
IOLoopザ・周りwarpper IS ASYNCIOイベントループ(非同期イベントループ)。
参考:
https://tornado-zh.readthedocs.io/zh/latest/guide/async.html