网工为什么要学 Rust?用一行命令颠覆你的认知
网工为什么要学 Rust?用一行命令颠覆你的认知
摘要: Python 慢、Go 够用、Rust 惊艳。本文从部署复杂度、运行性能、内存安全、并发模型四个维度,实测对比 Python/Go/Rust 在网络自动化场景下的表现,附带 benchmark 数据。读完你会明白:对于基础设施工具,Rust 是终极答案。
一、一个网工的信仰危机
2024 年,我写了 3 年的 Python 网络自动化脚本。巡检脚本、配置备份、IP 扫描——什么都是 Python。
直到有一天,我把脚本部署到一台全新服务器上:
$ python3 main.py
ModuleNotFoundError: No module named 'netmiko'
$ pip install netmiko
ERROR: Could not find a version that satisfies the requirement...
$ python3 --version
Python 3.8.10 # 系统自带,太老了
$ apt install python3.9
# 然后是一连串的依赖地狱...
我突然意识到:Python 脚本的"可移植性"是个笑话。
那天我开始寻找一种可以编译成单一二进制文件、拷贝即运行的语言。
Go 和 Rust 进入了视野。
二、三语言实战对比:同一个巡检任务
场景:对 100 台交换机执行 display version,解析软件版本号。
Python 实现(asyncio + netmiko)
import asyncio
from netmiko import ConnectHandler
async def check_device(ip):
device = {
'device_type': 'huawei',
'host': ip,
'username': 'admin',
'password': 'admin123',
}
try:
with ConnectHandler(**device) as conn:
output = conn.send_command('display version')
# 正则提取版本号...
return output
except Exception as e:
return str(e)
async def main():
ips = [f'192.168.1.{i}' for i in range(1, 101)]
tasks = [check_device(ip) for ip in ips]
results = await asyncio.gather(*tasks)
print(f'Checked {len(results)} devices')
asyncio.run(main())
Go 实现(goroutine + crypto/ssh)
package main
import (
"fmt"
"sync"
"golang.org/x/crypto/ssh"
)
func checkDevice(ip string, wg *sync.WaitGroup) {
defer wg.Done()
config := &ssh.ClientConfig{
User: "admin",
Auth: []ssh.AuthMethod{ssh.Password("admin123")},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
client, err := ssh.Dial("tcp", ip+":22", config)
if err != nil {
return
}
defer client.Close()
// 执行命令...
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 100; i++ {
wg.Add(1)
go checkDevice(fmt.Sprintf("192.168.1.%d", i), &wg)
}
wg.Wait()
}
Rust 实现(tokio + russh)
use tokio::task::JoinSet;
use russh::*;
async fn check_device(ip: &str) -> Result<String> {
let config = client::Config::default();
let mut client = russh::client::connect(config, (ip, 22)).await?;
// 认证、执行命令...
Ok(output)
}
#[tokio::main]
async fn main() {
let mut tasks = JoinSet::new();
for i in 1..=100 {
let ip = format!("192.168.1.{}", i);
tasks.spawn(async move { check_device(&ip).await });
}
while let Some(result) = tasks.join_next().await {
// 处理结果...
}
}
三、实测性能对比
测试环境:Ubuntu 22.04, 16 核 CPU, 32GB RAM,100 台模拟设备
| 指标 | Python | Go | Rust |
|---|---|---|---|
| 并发数 | 受 GIL 限制 | 原生 goroutine | 原生 async |
| 内存占用 | 380 MB | 45 MB | 28 MB |
| 100 台巡检耗时 | 47.3 秒 | 18.7 秒 | 15.2 秒 |
| 冷启动时间 | 0.8 秒 | 0.01 秒 | 0.003 秒 |
| 二进制大小 | 不适用 | 11 MB | 8 MB |
| 部署方式 | pip install + venv | 单文件 | 单文件 |
Rust 在内存效率上碾压 Python 13 倍,比 Go 还省 40%。
四、为什么 Rust 更适合基础设施工具
1. 零成本部署
# Python: 需要这些
apt install python3.9 python3-pip
pip install netmiko paramiko snmpwalk ...
# Go: 编译好了一个二进制
scp netops-tool server:/usr/local/bin/
# Rust: 同理,单文件部署,比 Go 更小更快
scp nexus-ops server:/usr/local/bin/
systemctl start nexus-ops
2. 编译期保证
Rust 的编译器会在编译阶段抓住所有类型错误、空指针、数据竞争:
// 这段代码根本编译不过——编译器救了未来的你
let device = get_device(id); // 返回 Option<Device>
let ip = device.ip_address; // ❌ 编译错误!Option 需要处理 None
// 正确写法:
if let Some(device) = get_device(id) {
let ip = device.ip_address; // ✅ 安全
}
Python 只有在运行到那一行时才会崩溃。凌晨三点的生产故障和新功能没关系?编译器说:有关系。
3. 内存安全无 GC
Go 有 GC(垃圾回收),在大规模并发场景下会出现 STW(Stop The World)延迟。Rust 的所有权系统在编译期就解决了内存管理,运行时零开销。
// Rust 的所有权系统——编译期内存管理
fn process_device(device: Device) -> String {
format!("{}:{}", device.name, device.ip_address)
// device 在这里被自动释放,无需 GC
}
4. 错误处理显式化
// Rust: 强制处理每个可能的错误
let content = match fs::read_to_string("/etc/config") {
Ok(s) => s,
Err(e) => {
tracing::error!("Failed to read config: {}", e);
return Err(e.into());
}
};
// Python: 错误可能被无声吞掉
try:
content = open('/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
SSH:russh
SNMP:自研异步客户端
前端:原生 JS + CSS 变量 + ECharts
部署:单二进制 + systemd
下一期预告
《5 分钟搭好开发环境:Rust + Axum 项目从零开始》——从 cargo new 到启动第一个 Web API,手把手带你写出可运行的项目骨架。
环境信息: Rust 1.85+, Ubuntu 22.04 / macOS 14+
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)