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

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

相关推荐
Java爱好狂.7 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
马良神笔9 小时前
2026 年Rag最近技术前沿总结
后端·python·django
程序猿DD9 小时前
同样10美元,OpenDesign和Command Code的DeepSeek V4.1 Flash额度到底有多少?
后端
高频因子挖掘机9 小时前
A股量化从日线升级到5分钟线:数据量增加后最先暴露哪些工程问题?
后端·github·api
高频因子挖掘机10 小时前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api
团子哒哒11 小时前
数组、切片和Map
后端
专注仿真11 小时前
ThinkPHP6 API接口开发实例:从零搭建RESTful风格接口
后端·php·restful
开心猴爷12 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
1m5555555512 小时前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
易小尊12 小时前
我的模型在 65% 以上时准得可怕,在 50% 时像在掷硬币
后端