Python 异步: 非阻塞流(20)

简介: Python 异步: 非阻塞流(20)

动动发财的小手,点个赞吧!

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

1. 异步流

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

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

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

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

  • 用于与 Web 服务器交互的 HTTP 或 HTTPS
  • 用于与电子邮件服务器交互的 SMTP
  • 用于与文件服务器交互的 FTP。

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

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

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():
    # ...
相关文章
|
1月前
|
数据采集 Java Python
python并发编程:Python异步IO实现并发爬虫
python并发编程:Python异步IO实现并发爬虫
24 1
|
1月前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
13天前
|
调度 数据库 Python
【专栏】异步IO在处理IO密集型任务中的高效性
【4月更文挑战第27天】本文介绍了Python并发编程和异步IO,包括并发的基本概念(多线程、多进程、协程),线程与进程的实现(threading和multiprocessing模块),协程的使用(asyncio模块),以及异步IO的原理和优势。强调了异步IO在处理IO密集型任务中的高效性,指出应根据任务类型选择合适的并发技术。
|
2月前
|
数据采集 数据挖掘 调度
异步爬虫实践攻略:利用Python Aiohttp框架实现高效数据抓取
本文介绍了如何使用Python的Aiohttp框架构建异步爬虫,以提升数据抓取效率。异步爬虫利用异步IO和协程技术,在等待响应时执行其他任务,提高效率。Aiohttp是一个高效的异步HTTP客户端/服务器框架,适合构建此类爬虫。文中还展示了如何通过代理访问HTTPS网页的示例代码,并以爬取微信公众号文章为例,说明了实际应用中的步骤。
|
4天前
|
API UED Python
使用Python进行异步HTTP请求的实践指南
使用Python进行异步HTTP请求的实践指南
18 4
|
12天前
|
并行计算 数据处理 开发者
Python并发编程:解析异步IO与多线程
本文探讨了Python中的并发编程技术,着重比较了异步IO和多线程两种常见的并发模型。通过详细分析它们的特点、优劣势以及适用场景,帮助读者更好地理解并选择适合自己项目需求的并发编程方式。
|
15天前
|
人工智能 算法 调度
uvloop,一个强大的 Python 异步IO编程库!
uvloop,一个强大的 Python 异步IO编程库!
24 2
|
16天前
|
API 调度 开发者
Python中的并发编程:使用asyncio库实现异步IO
传统的Python编程模式中,使用多线程或多进程实现并发操作可能存在性能瓶颈和复杂性问题。而随着Python 3.5引入的asyncio库,开发者可以利用异步IO来更高效地处理并发任务。本文将介绍如何利用asyncio库实现异步IO,提升Python程序的并发性能。
|
22天前
|
数据采集 缓存 算法
使用Python打造爬虫程序之Python中的并发与异步IO:解锁高效数据处理之道
【4月更文挑战第19天】本文探讨了Python中的并发与异步IO,区分了并发(同时处理任务)与并行(同时执行任务)的概念。Python的多线程受限于GIL,适合IO密集型任务,而多进程适用于CPU密集型任务。异步IO通过非阻塞和回调/协程实现高效IO,Python的asyncio库提供了支持。应用场景包括Web开发和网络爬虫等。实践指南包括理解任务类型、使用asyncio、避免阻塞操作、合理设置并发度和优化性能。理解并运用这些技术能提升Python程序的效率和性能。
|
24天前
|
开发者 Python
Python中的并发编程:使用asyncio模块实现异步任务
传统的Python编程中,使用多线程或多进程进行并发操作时,常常会面临性能瓶颈和资源竞争的问题。而随着Python 3.5版本的引入,asyncio模块为开发者提供了一种基于协程的异步编程方式。本文将介绍如何使用asyncio模块实现异步任务,提高Python程序的并发处理能力。