我刚想到了龙卷风和事件驱动编程的非阻塞基础设施。实际上我正在编写一个简单的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()
答案 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")