请问RUST如何控制并发数量?

发布于 2022-09-12 13:53:53 字数 1330 浏览 39 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

故事和酒 2022-09-19 13:53:53

可以考虑用semaphore 来解决,c++ boost 就是这样的机制。crates.io 里有一个semaphore库。

地狱即天堂 2022-09-19 13:53:53

改成用生成者、消费者模型,消费者的数量就限制了并发数,还不需要在循环里不断创建 goroutine 或 async task。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文