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

本文受 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

相关推荐
candyTong6 小时前
Claude Code Agent Teams:多 Agent 协作的生命周期与实现机制
后端·架构
IT_陈寒11 小时前
为什么你应该学习JavaScript?
前端·人工智能·后端
淇奥711 小时前
【MyBatis-Plus】MyBatis-Plus 学习笔记
后端
_code_bear_11 小时前
OpenSpec CLI 与 OPSX 工作流说明
前端·后端·架构
用户83562907805112 小时前
使用 Python 在 PowerPoint 中添加并控制音频播放
后端·python
用户83562907805112 小时前
使用 Python 在 PowerPoint 中生成并自定义饼图与环形图
后端·python
念何架构之路12 小时前
Go语言常见并发模式
开发语言·后端·golang
Cosolar12 小时前
大模型应用开发面试 • 第4期|A2A、复杂挑战与具身智能
人工智能·后端·面试
迷渡13 小时前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
王中阳Go13 小时前
秒杀、分库分表、全链路追踪:一个电商微服务的架构全拆解
后端·go