tornado和异步IO的基本简单流程原理

2019-10-14| 发布者: admin| 查看: |

处理返回值内容,调用ioloop.IOLoop.current.stop :param reponse: :return: if reponse.error: print else: print global REV_COUNTER REV_COUNTER+=1 if REV_COUNTER == REQ_COUNTER: print ioloop.IOLoop.current.stop def func: url_list = [ 'http://www.baidu.com', 'http://www.bing.com', global REQ_COUNTER REQ_COUNTER = len for url in url_list: print #建立连接 http_client = AsyncHTTPClient #发送请求,handle_response是回调函数 http_client.fetch,handle_response) #添加函数,事件循环 ioloop.IOLoop.current.add_callback #获取响应结果,事件循环 ioloop.IOLoop.current.start 异步IO的基本简单流程原理
#实现异步的基本流程
import socket
import select
req_list =[
 ["1.1.1.1",80],
 ["1.1.1.2",80],
conn_sock_list = []
sock_list = []
for i in req_list:
 client = socket.socket
 #不等待
 client.setblocking
 try:
 client.connect
 except Exception as e:
 pass
 sock_list.append
 conn_sock_list.append
while True:
 #IO的多路复用同步
 r,w,e = select.select
 #当其他人给咱们发送数据时候,我们可以接收r=[sk1]
 for sk in r:
 try:
 #接收8096数据,因为不知道接收到的数据是否都是8096字节的,所以得循环去接收
 while True:
 data = sk.recv
 if not data:
 sock_list.remove #当数据为空时候,http是短链接,接收到返回的数据http断开,不会接收到任何数据,数据接收完不再接收把之前获取到的数据移除
 except Exception as e:
 pass
 #连接成功的socket,可以有下一步的进展
 for sk in w:
 sk.sendall
 #已经发送过的请求在socket删除
 conn_sock_list.remove
 if not sock_list:
 break
上面的异步IO有一个缺陷就是没有保存获取响应结果的数据,可以新建一个类来解决这个问题
#实现异步的基本流程
import socket
import select
class HttpContext:
 def __init__:
 #client
 self.sock = sock
 #保存数据
 self.buffer = []
 def fileno:
 return self.sock.fileno