当前位置:   article > 正文

python3 asyncio socket_Python asyncio 异步编程(三)

asyncio.open_connection

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/85281
推荐阅读
相关标签
  

闽ICP备14008679号