设为首页 加入收藏

TOP

小白对异步IO的理解(三)
2018-11-14 12:08:19 】 浏览:331
Tags:小白 异步 理解
address = yield sock 12 try: 13 sock.connect(address) 14 except BlockingIOError: 15 pass 16 data = yield 17 size = yield sock.send(data) 18 yield sock.recv(size) 19 20 def main(): 21 inputs = [] 22 outputs = [] 23 coros = [] 24 coro_dict = dict() 25 for i in range(num): 26 coros.append(coroutine()) 27 sock = coros[-1].send(None) # 发送一个None值来启动生成器 28 outputs.append(sock.fileno()) # 29 # print(outputs) 30 coro_dict[sock.fileno()] = coros[-1] 31 coros[-1].send(('www.baidu.com', 80)) 32 while True: 33 r_list,w_list,e_list = select.select(inputs,outputs, ()) 34 for i in w_list: 35 # print(type(i)) 36 coro_dict[i].send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: Close\r\n\r\n') 37 outputs.remove(i) 38 inputs.append(i) 39 for i in r_list: 40 coro_dict[i].send(1024) 41 inputs.remove(i) 42 if len(inputs) == len(outputs) == 0: 43 break 44 # time.sleep(2) 45 # coro.send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: Close\r\n\r\n') 46 # select.select(wait_list, (), ()) 47 # print(coro.send(1024)) 48 49 start = time.time() 50 main() 51 print("spend time : %s" %(time.time()-start))

可以看到把发起请求的函数写成了一个生成器:

 1 def coroutine():
 2     sock = socket.socket()
 3     sock.setblocking(0)
 4     address = yield sock
 5     try:
 6         sock.connect(address)
 7     except BlockingIOError:
 8         pass
 9     data = yield
10     size = yield sock.send(data)
11     yield sock.recv(size)

然后监控IO状态,当IO状态发生改变之后,驱动生成器继续运行。

 1 while True:
 2         r_list,w_list,e_list = select.select(inputs,outputs, ())
 3         for i in w_list:
 4             # print(type(i))
 5             coro_dict[i].send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: Close\r\n\r\n')
 6             outputs.remove(i)
 7             inputs.append(i)
 8         for i in r_list:
 9             coro_dict[i].send(1024)
10             inputs.remove(i)

看一下程序执行时间:

1 ?  python3 5.py 10
2 spend time : 0.058114051818847656
3 ?  python3 5.py 20
4 spend time : 0.0949699878692627

效果貌似非常的棒啊,执行的太快了,但是当我执行300次请求的时候,我就发现问题了,返回的非常慢,。估计原因可能是select是顺序遍历每一个IO描述符的去做状态检查,当IO描述符过多的时候,会导致遍历的速度比较慢,所以造成时间花费很大。

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[经验总结] 在 windows 命令窗口.. 下一篇Pythond函数的参数使用操作注意事..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目