(1)linux中的epoll
IO多路复用(IO multiplexing)技术。是为处理大批量句柄而作了改进的poll, epoll主要是用来解决网络IO的并发问题,所以Tornado的异步编程也主要体现在网络IO的异步上,即异步Web请求。(服务器作为服务器,服务器作为客户端)异步来处理各种请求。IO多路复用技术
(2)epoll的优点
—支持一个进程打开大数目的socket描述符(FD):实际例子tornado服务器ioloop----epoll----socket(epoll打开大量的socket,解决C10K,实现高并发,HTTP长久连接问题),是Tornado不依靠多进程/多线程而达到高性能的原因(tornado服务器是单进程的)

—IO效率不随FD数目增加而线性下降
—.使用mmap加速内核与用户空间的消息传递
—内核微调

(3)linux下epoll如何实现高效处理百万句柄的—待解决
开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。

(4)浏览器地址栏中输入网址访问的方式为get请求方式,默认请求为get请求方式(注意get和post方式的不同)

(5)tornado是web框架(Application)和web服务器(httpServer)一体的web操作,其是单进程、单线程的服务器,我们引入了tornado.httpserver模块,顾名思义,它就是tornado的HTTP服务器实现。创建了一个HTTP服务器实例http_server,因为服务器要服务于我们刚刚建立的web应用Application,将接收到的客户端请求通过web应用中的路由映射表引导到对应的handler中,所以在构建http_server对象的时候需要传出web应用对象app。http_server.listen(8000)将服务器绑定到8000端口。

(6)django是多线程服务器,仅仅是web服务器框架,在部署的时候需要使用nginx服务器搭配django web框架,中间通过uwsgi(wsgi)来连接,WSGI(Web Server Gate Interface)的功能就是连接web框架和web服务器的。一般都是搭配nginx+uwsgi+django web应用

(7)web框架中的反向解析,正常的解析是由路由到应用,反向解析就是通过一个标识(一般设置一个name)来得到相应的路由,然后由路由到相关的应用。反向解析的作用就是从name属性得到路由url

(8)调用接口的总结(以tornado为例子)
tornado即是web框架也是web服务器,做web服务器时需要处理各种http请求,作为客户端的时候需要请求各种数据(请求数据可以使用调接口技术也可以使用ajax技术)这两个技术都是可以进行异步来处理的

Tornado提供了一个异步Web请求客户端tornado.httpclient.AsyncHTTPClient用来进行异步Web请求。这种是调用接口来实现的。
fetch(request, callback=None) 用于执行一个web请求request,并异步返回一个tornado.httpclient.HTTPResponse响应。request可以是一个url,也可以是一个tornado.httpclient.HTTPRequest对象。如果是url,fetch会自己构造一个HTTPRequest对象。

HTTPRequest

HTTP请求类,HTTPRequest的构造函数可以接收众多构造参数,最常用的如下:
--- url (string) – 要访问的url,此参数必传,除此之外均为可选参数
---method (string) – HTTP访问方式,如“GET”或“POST”,默认为GET方式
---headers (HTTPHeaders or dict) – 附加的HTTP协议头
---body – HTTP请求的请求体

HTTPResponse

HTTP响应类,其常用属性如下:

    code: HTTP状态码,如 200 或 404
    reason: 状态码描述信息
    body: 响应体字符串
    error: 异常(可有可无)

测试接口

新浪IP地址库

接口说明

1.请求接口(GET):
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=[ip地址字串]

2.响应信息:

(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商

3.返回数据格式:

{"ret":1,"start":-1,"end":-1,"country":"\u4e2d\u56fd","province":"\u5317\u4eac","city":"\u5317\u4eac","district":"","isp":"","type":"","desc":""}

从接口获取数据在tornado中可以使用异步—回调异步和协程异步,推荐使用协程异步

回调异步:

class IndexHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous  # 不关闭连接,也不发送响应
    def get(self):
        http = tornado.httpclient.AsyncHTTPClient()
        http.fetch("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=14.130.112.24",
                   callback=self.on_response)

    def on_response(self, response):
        if response.error:
            self.send_error(500)
        else:
            data = json.loads(response.body)
            if 1 == data["ret"]:
                self.write(u"国家:%s 省份: %s 城市: %s" % (data["country"], data["province"], data["city"]))
            else:
                self.write("查询IP信息错误")
        self.finish() # 发送响应信息,结束请求处理

协程异步:

class IndexHandler(tornado.web.RequestHandler):
    @tornado.gen.coroutine
    def get(self):
        http = tornado.httpclient.AsyncHTTPClient()
        response = yield http.fetch("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=14.130.112.24")
        if response.error:
            self.send_error(500)
        else:
            data = json.loads(response.body)
            if 1 == data["ret"]:
                self.write(u"国家:%s 省份: %s 城市: %s" % (data["country"], data["province"], data["city"]))
            else:
                self.write("查询IP信息错误")

异步的执行,服务器即做服务器也做客户端(处理很多业务需要异步的进行)使用Tornado内置的异步HTTP客户端进行调用(异步HTTP客户端)

(9)WebSocket
WebSocket是HTML5规范中新提出的客户端-服务器(浏览器-服务器)通讯协议(创建在TCP协议上),协议本身使用新的ws://URL格式。

WebSocket 是独立的、创建在 TCP 上的协议,和 HTTP 的唯一关联是使用 HTTP 协议的101状态码进行协议切换,使用的 TCP 端口是80,可以用于绕过大多数防火墙的限制。socket用来通信

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端直接向客户端推送数据而不需要客户端进行请求,两者之间可以创建持久性的连接,并允许数据进行双向传送。

目前常见的浏览器如 Chrome、IE、Firefox、Safari、Opera 等都支持 WebSocket,同时需要服务端程序支持 WebSocket。