我有一个简单的程序,我想优化。(我不关心消息的顺序)
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()
与一个时雄任务之间有什么权衡?
1条答案
按热度按时间oalqel3c1#
按顺序等待
send()
s保证了排序相对于接收机观察到的内容,tokio::spawn(chan.send(msg))
可能导致重新排序。tokio::spawn
消除了当消费者慢时对生产者的任何类型的反压力,即,mpsc::channel(buf_size)
在发送者必须等待之前在内部缓冲器中设置buf_size
消息的限制。buf_size
设置存储器消耗的上限,并且在消费者慢的情况下迫使发送者慢下来。如果您希望保持内存的硬上限,可以将缓冲区大小增加到能够处理突发消息的值,或者可以使用unbounded channel,它从不等待
send()
。如果生产者总是持续地超过接收者,那么你最终会遇到内存问题。
通过在接收端并行处理消息,您可能会看到更多的改进。