zoukankan      html  css  js  c++  java
  • tornado源码简单实现

    首先基本的同步流程是:

    class Index(tornado.web.RequestHandle):
        def get(self):
            self.write('hellow,word')
    
    app = tornado.web.Application(
    [(r'/index',Index)
    ]
    )
    if __name == '__main__':
    app.listen(8000)
    tornado.ioloop.IOLoop.instance().start()
    

     基本的异步流程是:

    import tornado.web
    import tornado.ioloop
    from tornado import gen
    from tornado.web import Future
    import time
    
    
    class MainHandler(tornado.web.RequestHandler):
        @gen.coroutine
        def get(self):
            print 123
            future = Future()
            tornado.ioloop.IOLoop.current().add_timeout(time.time() +5 ,self.doing)
            yield future
    
        def doing(self):
            self.write('1111')
            self.finish()
    
    
    
    app = tornado.web.Application(
        [(r'/index',MainHandler)]
    )
    
    if __name__ == '__main__':
        app.listen(8000)
        tornado.ioloop.IOLoop.instance().start()

    主要三个步骤实现异步,

    1、future函数

    2、事件循环

    3、生成器

    源码实现:

    route = (
    /^index$     func
    )
    result_dict{
    
    }
    s = socket.socket(...)
    s.bind(...)
    s.setblock(False)
    inputs = []
    inputs.append(s)
    while True:
    	r,w,e = select.select(inputs,[],e,0.05)   如果有链接连入,那么这个时候变化的是服务器的socket对象,所以连接的时候返回的r就是s,如果不是s那就是已连接的其他socket对象发送数据了
    	for i in r:
    	    if r == s:
    			conn,addr = i.accept()
    			inputs.append(conn)
    		else:
    			#有数据来了
    			data_list = []
    			while True:
    				data = i.recv(1024)
    				data.append(data)
    				if not data:
    					breake
    			#这个时候需要响应,在datalist里面获取请求头,获取url,然后获取url对应的函数
    			data = func()
    			if data is str:
    				i.sendall()
    				i.close()
    				inputs.remove(i)
    			
    	        else:  #如果返回的不是一个字符串而是一个对象,那么这个时候把这个对象保存到字典里面
    				result_dict[i] = data
    	for k,v in result_dict.items():
    		if v.status:
    			k.sendall()
    

      

  • 相关阅读:
    ReLu(Rectified Linear Units)激活函数
    限制Boltzmann机(Restricted Boltzmann Machine)
    栈式自动编码器(Stacked AutoEncoder)
    降噪自动编码器(Denoising Autoencoder)
    WebRequest/HttpWebRequest/HttpRequest/WebClient/HttpClient的区别
    JWT认证
    WebService概念和使用
    使用nvm安装node,全局npm,cnpm
    EF CodeFirst系列(8)---添加初始化数据和数据库迁移策略
    EF CodeFirst系列(7)--- FluentApi配置单个实体
  • 原文地址:https://www.cnblogs.com/qiangayz/p/9393707.html
Copyright © 2011-2022 走看看