欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

内存安全新范式:Rust 异步运行时 Tokio 的任务调度与背压

发表于:|最后更新:|分类:系统编程|阅读:326 次

Tokio 采用工作窃取(Work-Stealing)调度器在多线程间均衡任务负载;但无界 channel 会掩盖下游消费不足,必须使用有界 channel + 背压防止内存无限增长。

Rust 内存安全

一、有界 channel 实现背压

rust
use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    // 有界缓冲区,容量 100,满时 send 会等待
    let (tx, mut rx) = mpsc::channel::<u64>(100);

    tokio::spawn(async move {
        for i in 0..10_000 {
            if tx.send(i).await.is_err() { break; }
        }
    });

    while let Some(v) = rx.recv().await {
        // 模拟慢消费,上游生产者会自动被背压节流
        tokio::time::sleep(std::time::Duration::from_millis(1)).await;
        println!("consumed: {v}");
    }
}