工作过程,参考python官方手册实现了一个socket长连接的客户端,使用了asyncio库中的streamreader,实现过程中抓耳挠腮,有些地方百思不得其解,虽然工作交差了,但回来还是找了python协程相关资料,认为A. Jesse Jiryu Davis这位python大神的视频讲解,极为通俗易懂,
推荐指数:
协程学习
第一阶段案例学习
首先,使用阻塞
socket客户端
from selectors import DefaultSelector,EVENT_WRITE,EVENT_READ
import socket
import time
selector = DefaultSelector()
def get(path):
s = socket.socket()
s.setblocking(False)
try:
s.connect(('127.0.0.1',5000))
except BlockingIOError:
pass
request = 'GET %s HTTP/1.0\r\n\r\n' % path
#可写
selector.register(s.fileno(), EVENT_WRITE)
selector.select()
selector.unregister(s.fileno())
s.send(request.encode())
chunks = []
while True:
#可读
selector.register(s.fileno(), EVENT_READ)
selector.select()
selector.unregister(s.fileno())
chunk = s.recv(10)
if chunk:
print("recive chunk:%s" % chunk)
chunks.append(chunk)
else:
body = (b''.join(chunks)).decode()
print(body.split('\n')[0])
return
start = time.time()
get('/foo')
get('/bar')
print('took %.2f sec' % (time.time()-start))
## 参考
- [1] [一个使用 asyncio 协程的网络爬虫](https://linux.cn/article-8265-1.html)
- [2] [Python协程工作原理](https://www.bilibili.com/video/BV1N4411S7BP?t=32&p=2)