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

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

相关推荐
wang090727 分钟前
自己动手写一个spring之IOC_2
java·后端·spring
ltl1 小时前
推理退化:为什么大模型会输出乱码、死循环和无意义文本
后端
ltl1 小时前
架构视图与文档:C4 模型从入门到实战
后端
IT_陈寒4 小时前
Redis持久化这个坑,我爬了一整天才出来
前端·人工智能·后端
无风听海4 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
小小前端仔LC5 小时前
Node.js + LangChain + React:搭建个人知识库(六)- “吃什么”项目实战:从700+菜谱入库到Taro H5端JSON渲染
前端·后端
程序员黑豆5 小时前
AI全栈开发之Java:怎么配置Java环境变量
前端·后端·ai编程
苍何5 小时前
一手实测 Claude Fable 5,手搓了个 Obsidian 的 Codex 插件
后端
swipe6 小时前
做多轮对话 Agent,为什么我建议把短期记忆放到 Redis
后端·面试·llm
程序员黑豆6 小时前
AI全栈开发之Java:什么是JDK
前端·后端·ai编程