rust 优化通道发送

zzlelutf  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个简单的程序,我想优化。(我不关心消息的顺序)

use tokio::sync::mpsc;

use tokio::task;
use tokio::time::{sleep, Duration};

async fn do_sleep() {
    sleep(Duration::from_millis(100)).await;
}

#[tokio::main]
async fn main() {
    let (tx, mut rx) = mpsc::channel(32);
    let tx2 = tx.clone();

    let models = vec![1, 2, 3];

    for model in models {
        tx.send(format!("sending {}", model)).await;
    }

    while let Some(message) = rx.recv().await {
        do_sleep().await;
        println!("GOT = {}", message);
    }
}

具体地说,我想优化tx.send(),在未来 Package 每个tx.send()与一个时雄任务之间有什么权衡?

oalqel3c

oalqel3c1#

按顺序等待send() s保证了排序相对于接收机观察到的内容,tokio::spawn(chan.send(msg))可能导致重新排序。
tokio::spawn消除了当消费者慢时对生产者的任何类型的反压力,即,mpsc::channel(buf_size)在发送者必须等待之前在内部缓冲器中设置buf_size消息的限制。buf_size设置存储器消耗的上限,并且在消费者慢的情况下迫使发送者慢下来。
如果您希望保持内存的硬上限,可以将缓冲区大小增加到能够处理突发消息的值,或者可以使用unbounded channel,它从不等待send()
如果生产者总是持续地超过接收者,那么你最终会遇到内存问题。
通过在接收端并行处理消息,您可能会看到更多的改进。

相关问题