网站首页 > 技术文章 正文
大家好,我是ICodeWR。今天要记录的是 Python 软件开发I/O与网络优化的相关知识。
7.1 零拷贝技术(sendfile)
7.1.1 传统文件传输瓶颈
# 传统文件传输(多次数据拷贝)
def legacy_transfer(file_path, sock):
with open(file_path, 'rb') as f:
data = f.read() # 用户态缓存
sock.send(data) # 内核态拷贝
# 总拷贝次数:4次(磁盘→内核→用户→内核→网卡)
7.1.2 sendfile系统调用优化
# 零拷贝传输(Linux/MacOS可用)
import socket
import os
def zero_copy_transfer(file_path, sock):
with open(file_path, 'rb') as f:
file_size = os.path.getsize(file_path)
sock.sendfile(f, 0, file_size) # 直接在内核完成传输
# 拷贝次数:2次(磁盘→内核→网卡)
性能对比(传输1GB文件):
- 传统方式:12秒 | CPU占用80%
- Zero-Copy:0.8秒 | CPU占用15%
7.2 异步IO百万连接处理
7.2.1 异步服务器架构
import asyncio
from aiohttp import web
async def handle_request(request):
data = await request.post()
return web.json_response({"status": "ok"})
async def init_server():
app = web.Application()
app.router.add_post("/api", handle_request)
runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, '0.0.0.0', 8080)
await site.start()
print("Server started at http://0.0.0.0:8080")
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(init_server())
loop.run_forever()
7.2.2 连接池管理优化
from aiohttp import TCPConnector
async def fetch(url):
# 限制同一域名并发连接数
connector = TCPConnector(limit_per_host=10)
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get(url) as resp:
return await resp.text()
# 对比:无限制连接池容易导致服务器拒绝服务
7.3 协议缓冲区(Protobuf)优化
7.3.1 定义Proto格式
// person.proto
syntax = "proto3";
message Person {
int32 id = 1;
string name = 2;
repeated string emails = 3;
map attributes = 4;
}
7.3.2 Python序列化实战
from person_pb2 import Person
# 创建对象
p = Person()
p.id = 123
p.name = "Alice"
p.emails.append("alice@example.com")
p.attributes["role"] = "admin"
# 序列化
binary_data = p.SerializeToString() # 大小比JSON小60%
# 反序列化
p2 = Person()
p2.ParseFromString(binary_data)
7.4 高效序列化方案对比
7.4.1 性能对照表
方案 | 序列化速度 | 反序列化速度 | 数据大小 | Python支持 |
JSON | 1x | 1x | 1x | 原生支持 |
Pickle | 2x | 1.5x | 1.2x | 原生支持 |
MessagePack | 3x | 2.8x | 0.6x | 需要安装 |
Protocol Buffers | 5x | 4x | 0.4x | 需要生成代码 |
Arrow | 8x | 7x | 0.3x | 需要安装 |
7.4.2 实战案例:日志处理优化
import msgpack
# 传统JSON处理
def process_json_logs():
with open("logs.json") as f:
for line in f:
data = json.loads(line) # 1MB/s处理速度
# MessagePack优化
def process_msgpack_logs():
with open("logs.msgpack", "rb") as f:
while True:
chunk = f.read(4096)
if not chunk:
break
data = msgpack.unpackb(chunk) # 5MB/s处理速度
本章实验
实验7-1:构建高并发爬虫系统
需求:
- 同时监控500个新闻源
- 每秒处理1000+请求
- 响应时间<200ms
参考方案:
import asyncio
from aiohttp import ClientSession, TCPConnector
async def fetch_news(url, session):
try:
async with session.get(url, timeout=5) as resp:
html = await resp.text()
return parse_news(html)
except Exception as e:
return None
async def main():
connector = TCPConnector(limit=500) # 控制总连接数
async with ClientSession(connector=connector) as session:
tasks = [fetch_news(url, session) for url in news_urls]
results = await asyncio.gather(*tasks)
return [r for r in results if r]
# 执行效率:传统多线程方案 15秒 → 异步方案 1.2秒
I/O优化检查表
性能优化自查
- 是否启用零拷贝传输?
- 是否合理设置连接池参数?
- 序列化方案是否最优?
- 异步代码是否避免阻塞调用?
常见陷阱排查
- 检查文件描述符泄漏(lsof命令)
- 验证缓冲区大小设置(SO_SNDBUF/SO_RCVBUF)
- 分析TCP重传率(netstat -s)
- 监控内存映射文件使用量
将陆续更新 Python 编程相关的学习资料!
作者:ICodeWR
标签:#编程# #在头条记录我的2025# #春日生活打卡季# #python#
猜你喜欢
- 2025-04-26 Python机器学习库Sklearn系列教程(21)-参数优化
- 2025-04-26 DeepSeek高赞回答:35岁被优化搞python,月入过万,看完后绝了
- 2025-04-26 Python 列表:从入门到高阶,避坑 + 性能优化全攻略
- 2025-04-26 Python跨平台GUI开发终极指南:3大框架×5项优化×教育行业实战案例
- 2025-04-26 通过优化代码来提高 Python 程序执行速度
- 2025-04-26 超参数黑盒(Black-box)优化的Python代码示例
- 2025-04-26 Python人工智能tensorflow优化器Optimizer算法汇总
- 2025-04-26 Python贝叶斯优化器Bayes_opt优化深度森林Deep Forest分类模型
- 2025-04-26 300分钟Python入门第26天 - 小明的天气预测优化
- 2025-04-26 Deepseek还真不错帮着优化了Python代码
- 263℃Python短文,Python中的嵌套条件语句(六)
- 263℃python笔记:for循环嵌套。end=""的作用,图形打印
- 261℃PythonNet:实现Python与.Net代码相互调用!
- 256℃Python实现字符串小写转大写并写入文件
- 255℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 116℃原来2025是完美的平方年,一起探索六种平方的算吧
- 96℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 89℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)