赞
踩
asyncio 处理网络连接数据流
下面是处理网络连接的示例代码,连接三个网站,发送消息流,接收数据流。三个协程由一个线程并发完成:
# File Name: asyncio_stream.py
import asyncio
async def wget(host):
print('wget {}'.format(host))
# 创建 TCP 客户端并连接服务器,或者说创建一个 TCP 连接对象
# open_connection 接收两个参数:主机和端口号
# connect 是协程,这步仅是创建协程对象,立即返回,不阻塞
connect = asyncio.open_connection(host, 80)
# await 运行协程连接服务器,这步是阻塞操作,释放 CPU
# 连接创建成功后,asyncio.open_connection 方法的返回值就是读写对象
# 读写对象分别为 StreamReader 和 StreamWriter 实例
# 它们也是协程对象,底层调用 socket 模块的 send 和 recv 方法实现读写
reader, writer = await connect
# header 是发送给服务器的消息,意为获取页面的 header 信息
# 这个格式是固定的,见下图
header = 'GET / HTTP/1.0\r\nHost: {}\r\n\r\n'.format(host)
# 给服务器发消息,注意消息是二进制的
writer.write(header.encode())
# 这是一个与底层 IO 输入缓冲区交互的流量控制方法
# 当缓冲区达到上限时,drain() 阻塞,待到缓冲区回落到下限时,写操作恢复
# 当不需要等待时,drain() 会立即返回,例如上面的消息内容较少,不会阻塞
# 这就是一个控制消息的数据量的控制阀
await writer.drain()
# 给服务器发送消息后,就等着读取服务器返回来的消息
while True:
# 读取数据是阻塞操作,释放 CPU
# reader 相当于一个水盆,服务器发来的数据是水流
# readline 表示读取一行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。