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

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

相关推荐
GetcharZp2 小时前
比 Zap 还要快?Go 社区高性能日志神器 Zerolog 落地实践指南
后端
anzhxu2 小时前
Go基础之环境搭建
开发语言·后端·golang
刀法如飞2 小时前
一款Python语言Django框架DDD脚手架,适合中大型项目
后端·python·领域驱动设计
zb200641203 小时前
SpringBoot详解
java·spring boot·后端
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题】【Java基础篇】第7题:HashMap的get流程是什么
java·后端·面试·哈希算法·散列表·hash-index·hash
霸道流氓气质4 小时前
SpringBoot+LangChain4j+Ollama+RAG(检索增强生成)实现私有文档向量化检索回答
java·spring boot·后端
MiNG MENS4 小时前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
IT_陈寒4 小时前
Vite静态资源加载把我坑惨了
前端·人工智能·后端
2601_949814694 小时前
Spring Boot中的404错误:原因、影响及处理策略
java·spring boot·后端
RDCJM4 小时前
Spring Boot spring.factories文件详细说明
spring boot·后端·spring