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()
    

      

  • 相关阅读:
    Python写的简陋版一对一聊天工具,全双工
    Python函数的循环调用
    Python多进程
    正则表达式
    Python-urllib学习记录
    Android学习笔记8:使用HttpClient接口实现网络通信
    Java抽象类和接口的区别(好长时间没看这种文章了)
    Android笔记:bitmap转换与处理相关工具类,Bitmap与DrawAble与byte[]与InputStream之间的转换
    first work
    Android学习笔记7:使用SQLite方式存储数据
  • 原文地址:https://www.cnblogs.com/qiangayz/p/9393707.html
Copyright © 2011-2022 走看看