web-dev-qa-db-ja.com

竜巻のioloopと竜巻のワークフローは何ですか?

竜巻の内部ワークフローを知りたいのですが、 この記事 、それは素晴らしいですが、私には理解できないことがあります

ioloop.py内には、そのような関数があります

def add_handler(self, fd, handler, events):
    """Registers the given handler to receive the given events for fd."""
    self._handlers[fd] = handler
    self._impl.register(fd, events | self.ERROR)

これはどういう意味ですか?すべてのリクエストはadd_handlerをトリガーしますか、それともinit時に一度だけトリガーされますか?

すべてのソケット接続はファイル記述子を生成しますか、それとも一度だけ生成されますか?

ioloopとiostreamの関係は何ですか?

httpserverはioloopおよびiostreamとどのように連携しますか?

ワークフローチャートはありますか?はっきりと見えますか?

これらの質問でごめんなさい、私はただ混乱しました

リンク、提案、ヒントが役立ちます。どうもありがとう :)

28
limboy

あなたの質問に順番に答えられるかどうかを確認します。

  • ここで、__impl_は、使用可能なソケットポーリングメカニズムであり、Linuxではepoll、Windowsではselectです。したがって、self._impl.register(fd, events | self.ERROR)は、「何らかのイベントを待機する」要求を基盤となるオペレーティングシステムに渡します。これには、特にエラーイベントも含まれます。

    実行すると、HTTPServerは、IOLoop.add_handler()を使用して、接続を受け入れるソケットを登録します。接続が受け入れられると、より多くの通信ソケットが生成され、IOStreamを介してイベントハンドラーが追加される可能性があります。これにより、add_handler()も呼び出される場合があります。そのため、新しいハンドラーは、最初と接続の受信時の両方で追加されます。

  • はい、すべての新しいソケット接続には一意のファイル記述子があります。ただし、HTTPServerがリッスンしている元のソケットは、ファイル記述子を保持する必要があります。ファイル記述子は、オペレーティングシステムによって提供されます。

  • IOLoopは、ソケットに関連するイベントを処理します。たとえば、読み取り可能なデータがあるかどうか、書き込み可能かどうか、エラーが発生したかどうかなどです。 epollselectなどのオペレーティングシステムサービスを使用することで、これを非常に効率的に行うことができます。

    IOStreamは、単一の接続を介してストリーミングデータを処理し、IOLoopを使用してこれを非同期で実行します。たとえば、IOStreamは利用可能な限り多くのデータを読み取ることができ、次にIOLoop.add_handler()を使用してさらにデータが利用可能になるまで待機します。

  • listen()で、HTTPServerは、IOLoopを使用して接続をリッスンするために使用するソケットを作成します。接続が取得されると、socket.accept()を使用して新しいソケットが作成され、新しいHTTPConnectionを使用してクライアントと通信するために使用されます。

    HTTPConnectionIOStreamを使用して、クライアントとの間でデータを転送します。このIOStreamIOLoopを使用して、非同期で非ブロッキングの方法でこれを実行します。多くのIOStreamおよびHTTPConnectionオブジェクトは、すべて同じIOLoopを使用して一度にアクティブにすることができます。

これがあなたの質問のいくつかに答えることを願っています。良い構造図はわかりませんが、全体的な考え方は他のWebサーバーでもかなり似ているはずなので、周りに良い情報があるかもしれません。あなたがリンクしたその詳細な記事はかなり役に立ちましたので、十分に理解しているなら、もう一度試してみることをお勧めします:)。

30
mesilliac