4

永続的な接続をサポートするTornadoWebでHTTPサーバーを作成するにはどうすればよいですか。

つまり、接続を閉じることなく、多くのリクエストを受け取り、それらに応答できるようになります。非同期で実際にどのように機能しますか?

永続的な接続を処理するためのハンドラーの書き方を知りたいだけです。実際にはどのように機能しますか?

私はそのようなハンドラを持っています:

class MainHandler(RequestHandler):

count = 0
@asynchronous
def post(self):

    #get header content type 
    content_type = self.request.headers.get('Content-Type')
    if not content_type in ACCEPTED_CONTENT:
        raise HTTPError(403, 'Incorrect content type')
    text = self.request.body
    self.count += 1     

    command = CommandObject(text, self.count, callback = self.async_callback(self.on_response))
    command.execute()

def on_response(self, response):
    if response.error: raise HTTPError(500)
    body = response.body   
    self.write(body)
    self.flush()

execute は終了時にコールバックを呼び出します。

その方法で投稿が何度も呼び出され、クライアントからの httprequest ごとに 1 つの接続カウントが増加するという私の仮定は正しいですか? しかし、接続ごとに個別のカウント値がありますか?

4

3 に答える 3

5

あなたの仮定が正しいとは思いません。Tornado サーバーの仕組みについての私の理解では、クライアントからの各要求は新しいRequestHandler. デコレーターの目的は、ハンドラー関数 ( 、など) が戻った@tornado.web.asynchronousときに、サーバーが自動的に接続を閉じないようにすることです。しかし、結局のところ、各要求に対して 1 つの応答しかないと思います。postget

クライアントからの追加のリクエストが RequestHandler クラスの同じインスタンスに送られるとは思えません。代わりに、Tornado はロング ポーリング パラダイムを可能にするように設定されていると理解しています。通信の流れの例を次に示します。

  1. クライアントがPOSTTornado サーバーにリクエストを行う
  2. Tornado サーバーは、応答の準備ができているかどうかを確認します。そうでない場合は、RequestHandler何らかの種類のスタックまたはキューに追加できます (アプリケーション アーキテクチャによって異なります)。
  3. サーバーが応答を受け取り (別のユーザーが、接続を開くために配布する必要があるメッセージをキューに追加したなど)、応答を に配布してから、関数をRequestHandler呼び出して接続を閉じます。finish()
  4. クライアントはPOST、プロセスを繰り返すために別の要求を行います

真の永続的な接続を実装したい場合は、調べてみるとよいでしょうtornado.websocket( http://www.tornadoweb.org/documentation/websocket.html )。私はまだそのモジュールを試していないので、そこに入力を与えることはできません.

頑張ってください!

于 2011-11-10T22:15:48.920 に答える
0

Tornado Web フレームワークには、永続的な接続をサポートする独自のサーバー実装が実際に付属しているため、独自のサーバーを作成する必要はありません。ドキュメントには、本番環境 (nginx の背後) で使用する方法に関するセクションがあります。

于 2009-11-26T14:41:22.620 に答える
0

tornado.web モジュールのソースから、新しいハンドラーが常にインスタンス化されていることがわかります。とにかく、ハンドラーを再利用できるとは思いません。

于 2010-04-08T23:26:03.603 に答える