python3 asyncio socket_Python asyncio 异步编程(三)

本文通过实例代码展示了如何使用 Python3 的 asyncio 库处理网络连接,包括建立 TCP 客户端连接,发送和接收数据,以及优化读取信息的方式,如使用 async for 循环和 asyncio.as_completed 方法。
摘要由CSDN通过智能技术生成

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 表示读取一行࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值