龙卷风阻止代码

时间:2012-03-24 16:07:06

标签: python tornado event-driven

我刚想到了龙卷风和事件驱动编程的非阻塞基础设施。实际上我正在编写一个简单的webapp,它正在访问外部Web服务的HTTP-API。我理解为什么我应该将此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()

VS

@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 个答案:

答案 0 :(得分:1)

如果您在龙卷风中使用阻止代码,则在任何阻止代码等待时,同样的龙卷风进程无法处理任何其他请求。您的应用程序不会支持多个同时用户,即使阻止呼叫只需要100毫秒,它仍然是一个巨大的性能杀手。

如果以这种方式写作对你来说是痛苦的(对我而言),你可以使用龙卷风的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")