2012-03-24 14 views
0

私は竜巻とイベント駆動型プログラミングのノンブロッキングインフラストラクチャについて考えました。実際に私は外部WebサービスのHTTP-APIにアクセスしている単純なwebappを書いています。私はなぜこのAPIを非ブロックと呼ぶべきか理解しています。しかし、IOLoopがさらにループできるように、最初の呼び出しをノンブロッキングで行うだけであれば、何らかの欠点がありますか?例についてはTornado Blocking Code

@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() 

答えて

1

あなたはどのブロックコードが待っている間、できないプロセス、他の要求と同じトルネードプロセスを竜巻内のコードをブロック使用している場合。あなたのアプリは複数の同時ユーザーをサポートしません。ブロッキングコールが100msのようなものであっても、それはまだ巨大なパフォーマンスのキラーです。

このように書くことが(それは私のためである)あなたのために排気されている場合は、竜巻の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")