请问RUST如何控制并发数量?
golang 可以通过channl来实现并发数量的限制 如下
// slice 存储当前需要处理的任务
task := []string{
"task1",
"task2",
"task3",
}
limit := make(chan bool,10) // 定义空间为10的chan作为限流器
for i := range task {
idx := i // copy
limit<-true // 每次任务执行 塞入
go func() {
defer func() {
<-limit // 任务执行完毕 塞出
}()
// 处理任务
fmt.Println("task: ",task[idx])
}()
}
rust 有什么好的解决方案呢? 我是这样写的
use async_std::task;
use std::time::Duration;
use async_std::channel;
#[async_std::main]
async fn main() {
let mut task_list = Vec::new();
for i in 0..10000 {
task_list.push(format!("task: {}",i))
}
let (sen,rec) = channel::bounded(10);
for i in task_list {
sen.send(1).await;
let rec = rec.clone();
task::spawn(async move {
task::sleep(Duration::from_millis(500)).await;
println!("Processing {}",i);
rec.recv().await;
});
}
loop {
task::sleep(Duration::from_secs(1)).await;
}
}
如果使用上面方式解决 可能回出现处理task时发生异常以至于没有执行rec.recv().await
go通过defer 确定task处理完毕时必然回执行 处理令牌 , rust怎么解决呢?
使用一个结构体处理task 并重写它的Deref trait ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可以考虑用semaphore 来解决,c++ boost 就是这样的机制。crates.io 里有一个semaphore库。
改成用生成者、消费者模型,消费者的数量就限制了并发数,还不需要在循环里不断创建 goroutine 或 async task。