35|实操项目:如何实现一个基本的MPSC channel?
该思维导图由 AI 生成,仅供参考
测试驱动的设计
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了如何在Rust中实现一个高效的MPSC(多生产者单消费者)channel。通过测试驱动的设计方法,作者逐步展示了实现MPSC channel的需求和相应的代码实现。文章首先描述了基本的send/recv需求,并给出了相应的单元测试。接着,作者展示了多个sender发送数据的需求,并提出了对应的单元测试。然后,作者讨论了当队列为空时receiver被阻塞的需求,并给出了相应的单元测试。随后,作者提出了当所有sender退出后receiver继续接收数据的需求,并给出了相应的单元测试。最后,作者讨论了当没有receiver时sender发送数据应该报错的需求,并给出了相应的单元测试。整个过程中,作者使用了Mutex、Condvar和AtomicUsize等并发原语,展示了如何通过这些原语实现MPSC channel。读者可以通过本文了解如何使用Rust语言实现一个高效的MPSC channel,以及如何通过测试驱动的设计方法逐步满足不同的需求。文章内容详实,对于想要深入了解Rust并发编程的读者具有很高的参考价值。文章还介绍了如何优化MPSC channel的性能,通过减小临界区的大小和降低加锁的频率来提升整体性能。同时,作者提出了思考题,引导读者思考如何将unbounded MPSC channel修改为bounded MPSC channel。整体而言,本文是一篇深入探讨Rust并发编程的优质文章,对于想要深入学习Rust并发编程的读者具有很高的参考价值。
《陈天 · Rust 编程第一课》,新⼈⾸单¥68
全部留言(18)
- 最新
- 精选
- 乌龙猹这清晰的逻辑,完美诠释TDD 提前预定老师未来推出的 elixir 课程
作者回复: :)
2021-11-1711 - 罗杰老师在一遍遍的重复 TDD,然后我把 TDD 用在了现在的 Go 项目中,效果非常好,虽然开发的时间增长了,但是代码质量显著提高了。
作者回复: 嗯,TDD 强调关注于需求,强调测试先行,然后再一点点实现,一个 case 一个 case 跑通,有些过于模式化。我希望给大家带来的思考是,通过 test 来理解需求,然后把 test 作为数据结构和接口设计的一环,通过 test 不断完善数据结构和接口的设计,最后再实现。我个人还是习惯在接口确定后,一次性把系统实现,而不是一点点实现,测试,实现,测试。
2021-11-1725 - 彭亚伦一边追这最新的课程更新, 一边反复温习前面的课程; 之前追《westworld》都没这么过瘾过~
作者回复: 👍
2021-11-171 - Colt最喜欢老师的实践课,也许rust的知识学得还一知半解,但是跟着老师的思路敲代码感觉非常爽,很多时候一个顺便就完成了需求
作者回复: 👍
2021-12-05 - wowotuo也特别期待把异步tokio、元编程讲透
作者回复: 👍
2021-11-24 - wowotuo这个实操项目非常有意义,让我对这块有了一个体系性、深入的认知,值得多读多看。
作者回复: 👍
2021-11-24 - 罗同学我想请问一下,实现这个主要是为了理解channel 原理,这个案例可以用于实际生产不?还是说标准库里的性能会更好一点
作者回复: 对,只是用于理解,不建议用在生产环境。标准库或者 flume,crossbream 下的 channel 性能更好,优先考虑
2021-11-182 - Enoch Tang目前Sender 的Drop实现有bug,考虑以下场景: Receiver thread: 1. 加锁 2. 判断 sender 是否为0; 3. 使用CondVar wait 假设在 Receiver thread 执行完2之后切换到 其他线程执行 drop s 的操作,其他线程notify_all,此时 Receiver thread还没有进入到wait的状态,那么后面Receiver thread进入到wait状态后再也不会被唤醒了2023-11-11归属地:浙江1
- 约书亚Drop for Sender<T>的实现中,notify_all没有在Mutex的保护下进行。这是否会导致一种可能性: 1. receiver发现sender不为0,准备进入wait 2. sender被drop,减一,为0,执行notify_all 3. receiver执行wait,释放锁,阻塞住 此时已经没有sender能唤醒receiver ???2022-11-02归属地:天津21
- 爱学习的小迪看老师的课程真的是可以学习到很多东西啊,不止Rust。太爽了2022-04-101