0

竜巻とイベント駆動型プログラミングのノンブロッキングインフラストラクチャについて考えました。実際、私は外部WebサービスのHTTP-APIにアクセスする単純なWebアプリケーションを作成しています。このAPIをノンブロッキングと呼ぶ必要がある理由を理解しています。しかし、IOLoopがさらにループできるように、最初の呼び出しを非ブロッキングにするだけの場合、不利な点はありますか?

例えば:

@tornado.web.asynchronous
def get(self):
    nonblocking_call1(self._callback)

def _callback(self, response):
    self.write(str(response))
    self.write(str(blocking_call2()))
    self.write(str(blocking_call3()))
    self.finish()

対。

@tornado.web.asynchronous
def get(self):
    nonblocking_call1(self._nonblocking_callback1)

def _callback1(self, response):
    self.write(str(response))
    nonblocking_call2(self._nonblocking_callback2)

def _callback2(self, response):
    self.write(str(response))
    nonblocking_call3(self._nonblocking_callback3)

def _callback3(self, response):
    self.write(str(response))
    self.finish()
4

1 に答える 1

1

トルネード内でブロッキングコードを使用する場合、ブロッキングコードが待機している間、同じトルネードプロセスは他のリクエストを処理できません。アプリは複数の同時ユーザーをサポートしません。また、ブロッキング呼び出しに100ミリ秒程度しかかからない場合でも、パフォーマンスが大幅に低下します。

このように書くのが面倒な場合(私にとってはそうです)、tornadoのgenモジュールを使用できます。

class GenAsyncHandler(RequestHandler):
    @asynchronous
    @gen.engine
    def get(self):
        http_client = AsyncHTTPClient()
        response = yield gen.Task(http_client.fetch, "http://example.com")
        do_something_with_response(response)
        self.render("template.html")
于 2012-03-24T17:05:08.533 に答える