Tornado的异步客户端直接写起来并不简单,可以参考官方的异步客户端tornado.httpclient.AsyncHTTPClient[
https://github.com/facebook/tornado/blob/master/tornado/httpclient.py],要想使自己的服务是异步的,仅仅用上装饰器、yield是不够的,必须保证自己的写的客户端是异步的,即要用到tornado.ioloop.IOLoop,如 想让数据库操作支持异步,就可以自己仿照AsyncHTTPClient、在IOLoop的基础上实现一个数据库客户端。
要想写异步Tornado最简单的方法是用Celery: Distributed Task Queue[
http://www.celeryproject.org],Tornado接到请求后把所有的业务逻辑处理、数据库操作及其他相关的IO操作等交给Celery来处理,不管耗时多长,处理完后异步返回,就能保证整个服务是完全异步的,当然,简单的不涉及太多IO或太复杂计算的操作还是建议用Tornado同步处理,因为把任务交给Celery的RabbitMQ通信会有一定网络IO开销。
Tornado的Celery适配器:
https://github.com/mher/tornado-celery/Celery的其他相关适配器:
http://docs.celeryproject.org/en/latest/getting-started/introduction.html#framework-integration异步的代码可以这样:
@
tornado.web.asynchronous
@
tornado.gen.coroutine
def get(self, *args, **kwargs):
response = yield tornado.gen.Task(celery_task_do_something.apply_async, args=[self.request.arguments])
self.finish(response.result)
Celery很赞,可以自己实践下,回用上瘾的 ^_^ ~~