当前位置:

首页 > 编程开发 > Python异步之非阻塞流如何使用

Python异步之非阻塞流如何使用

1.异步流asyncio的一个主要好处是能够使用非阻塞流。Asyncio提供非阻塞I/O套接字编程。这是通过流提供的。可以打开提供对流写入器和流写入器的访问的套接字。然后可以使用协同程序从流中写入和读取数据,并在适当的时候暂停。完成后,可以关闭套接字。异步流功能是低级的,这意味着必须手动实现所需的任何协议。这可能包括常见的Web协议,例如:用于与Web服务器交互的HTTP或HTTPS用于与电子邮件服务器交互的SMTP用于与文件服务器交互的FTP。这些流还可用于创建服务器以使用标准协议处理请求,或开发您自己

本文目录

    1. 异步流

    asyncio 的一个主要好处是能够使用非阻塞流。

    Asyncio 提供非阻塞 I/O 套接字编程。这是通过流提供的。

    可以打开提供对流写入器和流写入器的访问的套接字。然后可以使用协同程序从流中写入和读取数据,并在适当的时候暂停。完成后,可以关闭套接字。

    异步流功能是低级的,这意味着必须手动实现所需的任何协议。

    这可能包括常见的 Web 协议,例如:

    这些流还可用于创建服务器以使用标准协议处理请求,或开发您自己的特定于应用程序的协议。

    现在我们知道什么是异步流,让我们看看如何使用它们。

    2. 如何打开连接

    可以使用 asyncio.open_connection() 函数打开 asyncio TCP 客户端套接字连接。

    这是一个必须等待的协程,一旦套接字连接打开就会返回。

    该函数返回用于与套接字交互的 StreamReader 和 StreamWriter 对象。

    ...
    # open a connection
    reader, writer = await asyncio.open_connection(...)

    asyncio.open_connection() 函数采用许多参数来配置套接字连接。两个必需的参数是主机和端口。

    host 是一个字符串,指定要连接的服务器,例如域名或 IP 地址。

    port为socket端口号,如HTTP服务器为80,HTTPS服务器为443,SMTP为23等。

    ...
    # open a connection to an http server
    reader, writer = await asyncio.open_connection('www.google.com', 80)

    通过 SSL 协议支持加密套接字连接。最常见的例子可能是正在取代 HTTP 的 HTTPS。这可以通过将“ssl”参数设置为 True 来实现。

    ...
    # open a connection to an https server
    reader, writer = await asyncio.open_connection('www.google.com', 443, ssl=True)

    3. 如何启动服务器

    可以使用 asyncio.start_server() 函数打开 asyncio TCP 服务器套接字。这是一个必须等待的协程。

    该函数返回一个代表正在运行的服务器的 asyncio.Server 对象。

    ...
    # start a tcp server
    server = await asyncio.start_server(...)

    三个必需的参数是回调函数、主机和端口。回调函数是一个由名称指定的自定义函数,每次客户端连接到服务器时都会调用该函数。

    主机是客户端将指定连接的域名或 IP 地址。端口是接收连接的套接字端口号,例如 21 用于 FTP 或 80 用于 HTTP。

    # handle connections
    async def handler(reader, writer):
    	# ...
    ...
    # start a server to receive http connections
    server = await asyncio.start_server(handler, '127.0.0.1', 80)

    4. 如何使用 StreamWriter 写入数据

    我们可以使用 asyncio.StreamWriter 将数据写入套接字。数据以字节形式写入。可以使用 write() 方法将字节数据写入套接字。

    ...
    # write byte data
    writer.write(byte_data)

    或者,可以使用 writelines() 方法写入组织成列表或可迭代的多“行”字节数据。

    ...
    # write lines of byte data
    writer.writelines(byte_lines)

    写入数据块或挂起调用协程的方法都没有。写入字节数据后,最好通过 drain() 方法清空套接字。这是一个Coroutine,将暂停呼叫者,直到传输字节并准备好插座为止。

    ...
    # write byte data
    writer.write(byte_data)
    # wait for data to be transmitted
    await writer.drain()

    5. 如何使用 StreamReader 读取数据

    我们可以使用 asyncio.StreamReader 从套接字读取数据。数据以字节格式读取,因此字符串在使用前可能需要进行编码。所有读取方法都是必须等待的协程。

    可以通过 read() 方法读取任意数量的字节,该方法将一直读取到文件末尾 (EOF)。

    ...
    # read byte data
    byte_data = await reader.read()

    此外,可以通过“n”参数指定要读取的字节数。如果您知道下一个响应的预期字节数,这可能会有所帮助。

    ...
    # read byte data
    byte_data = await reader.read(n=100)

    可以使用 readline() 方法读取单行数据。这将返回字节,直到遇到换行符“\n”或 EOF。

    这在阅读使用文本行操作的标准协议时很有用。

    ...
    # read a line data
    byte_line = await reader.readline()

    此外,还有一个 readexactly() 方法来读取确切数量的字节,否则会引发异常,还有一个 readuntil() 方法将读取字节,直到读取字节形式的指定字符。

    6. 如何关闭连接

    可以通过 asyncio.StreamWriter 关闭套接字。可以调用 close() 方法来关闭套接字。此方法不会阻塞。

    ...
    # close the socket
    writer.close()

    虽然 close() 方法不会阻塞,但我们可以等待套接字完全关闭后再继续。这可以通过 wait_closed() 方法来实现。这是一个可以等待的协程。

    ...
    # close the socket
    writer.close()
    # wait for the socket to close
    await writer.wait_closed()

    我们可以通过 is_closing() 方法检查套接字是否已经关闭或正在关闭。

    ...
    # check if the socket is closed or closing
    if writer.is_closing():
    	# ...
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。