Tornado学习之入门篇

Python 2016-03-06

  简单来说Tornado是Python写的一个框架,这个框架的特别之处在于它既是一个Web framework,也可以是Web Server(facebook用它做FriendFeed),采用异步IO模型,支持WSGI,在官方定义的4种功能中,它还可以作为协同组件,即和其它框架一起使用,包括Django。这几种功能并不冲突,使用主要取决于需求。总之,Tornado是一个简单高效的多用途框架。 

  Tornado是异步和非阻塞的(理解这两个概念有助于Tornado的学习),我们知道同步网络的的缺点是需要花费时间等待,而为了减少连接等待的时间,Tornado采用单线程轮询的方法,这样确保在任何一个时刻只进行一个操作,保证了异步和阻塞。

  Tornado的异步可以通过1.Callback argument(回掉参数)2.return(Future, Promise, Deferred)3.queue 4.Callback registry(回掉注册) 四个接口来实现。但建议采用Coroutines方式来实现异步。

  那么什么是Coroutines呢?

  Coroutines就是采用yield(简单来说就是生成器,用于迭代)关键字终止或者恢复执行程序而不是采用回调方式,这样能够有效减少使用线程所花费的时间。   具体用法如下:

from tornado import gen  
@gen.coroutine
def fetch_coroutine(url):
    http_client = AsyncHTTPClient()
    response = yield http_client.fetch(url)
    # 在Python3.3之后需返回gen.Return(response.body)
    return response.body

  下面来看一个Tronado Web程序的简单示例:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):  #请求
    def get(self):
        self.write("Hello, world") #网页输出

def make_app():  #转发
    return tornado.web.Application([
        (r"/", MainHandler),  #访问路径
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)  #启动监听
    tornado.ioloop.IOLoop.current().start() #启动程序

  主要使用Handler实现请求,可以实现路径的转发,要注意的是handlers默认是同步的,如果要变成异步,则需使用Coroutines方法。下面是两种方法的比较:   同步:

 class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        http = tornado.httpclient.AsyncHTTPClient()
        http.fetch("http://friendfeed-api.com/v2/feed/bret",
                   callback=self.on_response)

    def on_response(self, response):
        if response.error: raise tornado.web.HTTPError(500)
        json = tornado.escape.json_decode(response.body)
        self.write("Fetched " + str(len(json["entries"])) + " entries "
                   "from the FriendFeed API")
        self.finish()

  异步:

  class MainHandler(tornado.web.RequestHandler):
    @tornado.gen.coroutine
    def get(self):
        http = tornado.httpclient.AsyncHTTPClient()
        response = yield http.fetch("http://friendfeed-api.com/v2/feed/bret")
        json = tornado.escape.json_decode(response.body)
        self.write("Fetched " + str(len(json["entries"])) + " entries "
                   "from the FriendFeed API")

  运行后可以通过浏览器访问,可以看到Hellow,World。如果要实现复杂应用则需要修改路由表,增加模板。   web应用的模板一般放在根目录的templates文件夹下,css及js放在同级static文件下,具体使用会在接下来的文章中介绍。


本文由 Tony 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

赏个馒头吧