网工为什么要学 Rust?用一行命令颠覆你的认知
网工为什么要学 Rust用一行命令颠覆你的认知摘要Python 慢、Go 够用、Rust 惊艳。本文从部署复杂度、运行性能、内存安全、并发模型四个维度实测对比 Python/Go/Rust 在网络自动化场景下的表现附带 benchmark 数据。读完你会明白对于基础设施工具Rust 是终极答案。一、一个网工的信仰危机2024 年我写了 3 年的 Python 网络自动化脚本。巡检脚本、配置备份、IP 扫描——什么都是 Python。直到有一天我把脚本部署到一台全新服务器上$ python3 main.py ModuleNotFoundError: No module namednetmiko$ pipinstallnetmiko ERROR: Could notfinda version that satisfies the requirement... $ python3--versionPython3.8.10# 系统自带太老了$aptinstallpython3.9# 然后是一连串的依赖地狱...我突然意识到Python 脚本的可移植性是个笑话。那天我开始寻找一种可以编译成单一二进制文件、拷贝即运行的语言。Go 和 Rust 进入了视野。二、三语言实战对比同一个巡检任务场景对 100 台交换机执行display version解析软件版本号。Python 实现asyncio netmikoimportasynciofromnetmikoimportConnectHandlerasyncdefcheck_device(ip):device{device_type:huawei,host:ip,username:admin,password:admin123,}try:withConnectHandler(**device)asconn:outputconn.send_command(display version)# 正则提取版本号...returnoutputexceptExceptionase:returnstr(e)asyncdefmain():ips[f192.168.1.{i}foriinrange(1,101)]tasks[check_device(ip)foripinips]resultsawaitasyncio.gather(*tasks)print(fChecked{len(results)}devices)asyncio.run(main())Go 实现goroutine crypto/sshpackagemainimport(fmtsyncgolang.org/x/crypto/ssh)funccheckDevice(ipstring,wg*sync.WaitGroup){deferwg.Done()config:ssh.ClientConfig{User:admin,Auth:[]ssh.AuthMethod{ssh.Password(admin123)},HostKeyCallback:ssh.InsecureIgnoreHostKey(),}client,err:ssh.Dial(tcp,ip:22,config)iferr!nil{return}deferclient.Close()// 执行命令...}funcmain(){varwg sync.WaitGroupfori:1;i100;i{wg.Add(1)gocheckDevice(fmt.Sprintf(192.168.1.%d,i),wg)}wg.Wait()}Rust 实现tokio russhusetokio::task::JoinSet;userussh::*;asyncfncheck_device(ip:str)-ResultString{letconfigclient::Config::default();letmutclientrussh::client::connect(config,(ip,22)).await?;// 认证、执行命令...Ok(output)}#[tokio::main]asyncfnmain(){letmuttasksJoinSet::new();foriin1..100{letipformat!(192.168.1.{},i);tasks.spawn(asyncmove{check_device(ip).await});}whileletSome(result)tasks.join_next().await{// 处理结果...}}三、实测性能对比测试环境Ubuntu 22.04, 16 核 CPU, 32GB RAM100 台模拟设备指标PythonGoRust并发数受 GIL 限制原生 goroutine原生 async内存占用380 MB45 MB28 MB100 台巡检耗时47.3 秒18.7 秒15.2 秒冷启动时间0.8 秒0.01 秒0.003 秒二进制大小不适用11 MB8 MB部署方式pip install venv单文件单文件Rust 在内存效率上碾压 Python 13 倍比 Go 还省 40%。四、为什么 Rust 更适合基础设施工具1. 零成本部署# Python: 需要这些aptinstallpython3.9 python3-pip pipinstallnetmiko paramiko snmpwalk...# Go: 编译好了一个二进制scpnetops-tool server:/usr/local/bin/# Rust: 同理单文件部署比 Go 更小更快scpnexus-ops server:/usr/local/bin/ systemctl start nexus-ops2. 编译期保证Rust 的编译器会在编译阶段抓住所有类型错误、空指针、数据竞争// 这段代码根本编译不过——编译器救了未来的你letdeviceget_device(id);// 返回 OptionDeviceletipdevice.ip_address;// ❌ 编译错误Option 需要处理 None// 正确写法ifletSome(device)get_device(id){letipdevice.ip_address;// ✅ 安全}Python 只有在运行到那一行时才会崩溃。凌晨三点的生产故障和新功能没关系编译器说有关系。3. 内存安全无 GCGo 有 GC垃圾回收在大规模并发场景下会出现 STWStop The World延迟。Rust 的所有权系统在编译期就解决了内存管理运行时零开销。// Rust 的所有权系统——编译期内存管理fnprocess_device(device:Device)-String{format!({}:{},device.name,device.ip_address)// device 在这里被自动释放无需 GC}4. 错误处理显式化// Rust: 强制处理每个可能的错误letcontentmatchfs::read_to_string(/etc/config){Ok(s)s,Err(e){tracing::error!(Failed to read config: {},e);returnErr(e.into());}};// Python: 错误可能被无声吞掉try:contentopen(/etc/config).read()except:pass # 谁写的五、网工学 Rust 的难度曲线第 1 天ownership / borrowing —— 想自杀 第 3 天Vec / HashMap / String —— 好像能写东西了 第 7 天serde / tokio —— 居然跑起来了 第 14 天写了一个完整的 Web API —— 真香 第 30 天回头看 Python 代码 —— 这也能叫语言Rust 的难度被夸大了。对于写过 Python 或 Go 的工程师两周就能写生产级代码。难度主要集中在所有权和生命周期但 Web 开发场景中大部分时间不需要手动标注生命周期。六、什么时候不该用 Rust坦白说Rust 不是万能药场景推荐语言一次性数据分析脚本Python ✅机器学习/深度学习Python ✅快速原型验证Python/Go ✅长期运行的基础设施Rust ✅网络设备管理平台Rust ✅CLI 工具链Rust ✅七、本系列技术栈后端Rust Axum Tokio 数据库SQLite rusqlite SSHrussh SNMP自研异步客户端 前端原生 JS CSS 变量 ECharts 部署单二进制 systemd下一期预告《5 分钟搭好开发环境Rust Axum 项目从零开始》——从cargo new到启动第一个 Web API手把手带你写出可运行的项目骨架。环境信息Rust 1.85, Ubuntu 22.04 / macOS 14