透明的多级并发(行) 方式

本文受 bitbashing.io/async-rust.... 启发,其中2,3,4 节选自原文.

透明的多级并发(行) 方式

1.多机分布式并发(行)

2.单机多进程

构建并发系统最简单的方法之一就是将代码拆分成多个进程。毕竟,操作系统是一个精简高效的并发机器,它会与硬件协同工作,让每个进程都觉得自己拥有了整个系统。操作系统的调度程序为我们提供了免费的并行性,运行时间片 任何在可用 CPU 核心上就绪的进程。 曾几何时,这是 唯一的方式 ,并且我们今天在将 shell 命令通过管道连接在一起时仍然使用它。

但这种方法有其局限性。进程间通信成本不低,因为大多数实现都需要将数据复制到操作系统内存,然后再复制回来

3.多线程间基于互斥锁的并发

我们可以使用线程 (共享相同内存的进程)来避免这些开销。常识告诉我们,应该将它们与诸如互斥锁条件变量信号量之类 的神秘"野兽"联系起来。这是一场危险的游戏!简单的错误就会让你陷入竞争条件的 困境。 还有死锁和其他可怕的 问题,让你的代码里充满了 bug,比如只有在周二下雨,气温是 3 的倍数的时候才会出现。如果你想了解这些东西在现代硬件上是如何运作的,那就只有上帝保佑了.

4.线程间基于通道的并发

还有另一种方法。Tony Hoare 在其 1978 年的论文 《通信顺序进程 》中建议将线程与队列(或通道) 连接起来,以便线程之间互相发送消息。这种方法有很多优点

由于线程不共享内存,它们与程序的其他部分享有类似进程的隔离。(内存安全的语言很难意外扰乱其他线程,这是加分项!)

每个线程都有一组非常明显的输入(它从哪个通道接收数据)和输出(它发送到哪个通道)。这很容易理解,也很容易调试!对通道进行监测可以增强系统可见性,测量每个线程的吞吐量。

通道同步的 。如果通道为空,接收方会等待,直到通道有数据。如果通道已满,发送方会等待。线程在有工作要做时永远不会休眠,如果它们的速度超过系统其他部分,则会优雅地暂停。

经过数十年的互斥疯狂之后, 许多现代语言都听取了霍尔的建议, 在其标准库中提供通道。 在 Rust 中,我们称它们为 std::sync::mpsc::sync_channel

5. 基于协程的并发

比如go 的协程,js 的 promise, java 的绿色线程,rust 的 async/await 等...

6. 硬件指令集并发

比如 SIMD,GPU

综上1-6 并发(行) 粒度越来越小.并尽可能做到对用户透明


Async Rust Is A Bad Language

相关推荐
235162 小时前
【Redis】缓存击穿、缓存穿透、缓存雪崩的解决方案
java·数据库·redis·分布式·后端·缓存·中间件
Java水解3 小时前
深入掌握 ExcelJS:Node.js 中强大的 Excel 操作库
后端·excel
Java水解3 小时前
深度解析 Spring MVC `@ModelAttribute` 注解
后端·spring
调试人生的显微镜3 小时前
Python 爬虫 HTTPS 实战,requests httpx aiohttp 抓取技巧、证书问题与抓包调试全流程
后端
程序猿DD3 小时前
Spring Boot 4 与 Spring Framework 7 全面解析:新特性、升级要点与实战指南
java·spring boot·后端
用户6120414922134 小时前
jsp+servlet做的咖啡品牌管理后台
java·前端·后端
汇匠源4 小时前
基于springboot家政、上门服务、Java源码系统功能结构
java·spring boot·后端
麦兜*4 小时前
Spring Boot集群 集成Nginx配置:负载均衡+静态资源分离实战
java·spring boot·后端·nginx·spring·缓存·负载均衡
绝无仅有4 小时前
MySQL 面试题及详细解答(二)
后端·面试·github