模块介绍
selectors 库是 Python 3 标准库的一部分,用于实现 I/O 多路复用。它提供了一组跨平台的接口,用于监视多个文件对象,等待它们变为可读、可写或有错误出现。该库是基于更底层的 select 模块,但提供了更高层次和抽象的接口,方便开发者使用。
该模块适配的 Python 版本是 Python 3.4 及以上版本。
应用场景
selectors 库主要用于网络编程和并发编程中的 I/O 操作。当需要在多个网络连接上高效地进行读写操作时,selectors 库能够显著提高性能和资源利用率。它适用于以下场景:
- 网络服务器:管理多个客户端连接,同时处理多个 I/O 操作。
- Web 抓取:同一时间抓取多个网页,提高抓取速度。
- 并发编程:高效管理并处理大量 I/O 任务,避免阻塞。
安装说明
selectors 库是 Python 3 的内置标准库,不需要额外安装。只需确保使用的 Python 版本为 3.4 或更高版本便可直接导入使用。
用法举例
示例 1:简单的 I/O 多路复用
这个例子展示了如何使用 selectors 库监视多个文件对象,确保它们变为可读时进行读取操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import selectors import socket
sel = selectors.DefaultSelector()
def accept(sock, mask): conn, addr = sock.accept() conn.setblocking(False) sel.register(conn, selectors.EVENT_READ, read)
def read(conn, mask): data = conn.recv(1024) if data: print(f"received {data}") else: sel.unregister(conn) conn.close()
sock = socket.socket() sock.bind(('localhost', 12345)) sock.listen() sock.setblocking(False) sel.register(sock, selectors.EVENT_READ, accept)
while True: events = sel.select() for key, mask in events: callback = key.data callback(key.fileobj, mask)
|
示例 2:客户端连接管理
这个例子展示了如何利用 selectors 库管理多个客户端连接,并对其进行广播消息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import selectors import socket
sel = selectors.DefaultSelector()
clients = []
def accept(sock, mask): conn, addr = sock.accept() print(f'Accepted connection from {addr}') conn.setblocking(False) sel.register(conn, selectors.EVENT_READ, read) clients.append(conn)
def read(conn, mask): data = conn.recv(1024) if data: broadcast(data) else: print(f'Connection closed by {conn.getpeername()}') sel.unregister(conn) clients.remove(conn) conn.close()
def broadcast(data): for client in clients: client.send(data)
sock = socket.socket() sock.bind(('localhost', 12345)) sock.listen() sock.setblocking(False) sel.register(sock, selectors.EVENT_READ, accept)
while True: events = sel.select() for key, mask in events: callback = key.data callback(key.fileobj, mask)
|
示例 3:高效文件读取
本例展示如何利用 selectors 库实现高效文件读取,避免长时间等待文件读取完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import selectors import os
sel = selectors.DefaultSelector()
def read_file(file, mask): data = file.read(1024) if data: print(f'Read {len(data)} bytes from file') sel.modify(file, selectors.EVENT_READ, read_file) else: print('File read completed') sel.unregister(file) file.close()
file = open('example.txt', 'rb') sel.register(file, selectors.EVENT_READ, read_file)
while True: events = sel.select() for key, mask in events: callback = key.data callback(key.fileobj, mask)
|
我强烈建议大家关注我的博客 “全糖冲击博客”。在这里,您将找到所有 Python 标准库的使用教程,不论是网络编程、数据处理还是系统操作,都能查到详尽的讲解和实用的示例代码。通过订阅我的博客,您可以第一时间获取最新技术干货和实战经验,帮助您快速提升 Python 技能。欢迎一键关注,开启更高效的编程之旅!
软件版本可能变动
如果本文档不再适用或有误,请留言或联系我进行更新。让我们一起营造良好的学习氛围。感谢您的支持! - Travis Tang