Golang的CSP模型讲解

一.CSP是什么

CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,是一个很强大的并发数据模型,是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯channel(管道-用于传输和同步数据)进行通信的并发模型,在CSP模型中,每个并发执行的任务都是独立的,它们之间不会共享同一块内存空间,而是通过通信来进行数据交换和协调,相对于Actor模型,CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel,严格来说,CSP 是一门形式语言(类似于 ℷ calculus),用于描述并发系统中的互动模式,也因此成为一众面向并发的编程语言的理论源头,并衍生出了 Occam/Limbo/Golang…

而具体到编程语言,如 Golang,其实只用到了 CSP 的很小一部分,即理论中的 Process/Channel(对应到语言中的 goroutine/channel):这两个并发原语之间没有从属关系, Process 可以订阅任意个 Channel,Channel 也并不关心是哪个 Process 在利用它进行通信,Process 围绕 Channel 进行读写,形成一套有序阻塞可预测的并发模型

二.Golang的CSP模型

与主流语言通过共享内存来进行并发控制方式不同,Go语言采用了 CSP 模式,这是一种用于描述两个独立的并发实体通过共享的通讯Channel(管道)进行通信的并发模型,Go 就是借用CSP模型的一些概念为之实现并发进行理论支持,其实从实际上出发,go语言并没有,完全实现了CSP模型的所有理论,仅仅是借用了 process和channel这两个概念,process是在Go语言上的表现就是goroutine,是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享,Go并发的核心哲学是:不要通过共享内存来通信,而应该通过通信来共享内存,从以上描述可知:Go语言的CSP模型是由协程goroutine管道channel实现的:

  • Go协程见:Golang协程详解
  • 通道channel见:Golang Channel 详细原理和使用技巧,协程之间虽然解耦,但是它们和Channel有着耦合,Go 通过 channel 实现 CSP 通信模型,主要用于 goroutine 之间的消息传递事件通知

有了channel和goroutine之后,Go 的并发编程变得异常容易和安全,得以让程序员把注意力留到业务上去,实现开发效率的提升

 以上就是Go语言中的独立并发执行(CSP)模型的详细内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion科普文章【附升级gpt4.0秘笈】

随着人工智能技术的飞速发展,我们越来越多地看到计算机生成的艺术作品出现在我们的生活中。其中,Stable Diffusion作为一种创新的图像生成技术,正在引领一场艺术创作的革命。本文将为您科普Stable Diffusion的相关知识,带您走进这…

微信小程序睡眠X秒【while循环模式】

// 微信小程序睡眠X秒sleep(numberMillis) { var now new Date(); var exitTime now.getTime() numberMillis; while (true) { now new Date(); if (now.getTime() > exitTime) {return;}} }, // 微信小程序睡眠X秒 this.sleep(2000); 参考:微信小程序睡眠…

Linux/Ubuntu/Debian控制台启动的程序和terminal分离的方法-正在运行怎么关闭窗口

disown 是一个 shell 内置函数,它从 shell 的作业表中删除指定的作业,使它们免受挂起的影响。 使用方法如下: 首先,正常运行命令: 你的命令然后,按 Ctrl Z 暂停命令。 现在,运行&#xff…

MT1069 圆切平面

n个圆最多把平面分成几部分?输入圆的数量N,问最多把平面分成几块。比如一个圆以把一个平面切割成2块。 不考虑负数,0或者其他特殊情况。 格式 输入格式:输入为整型 输出格式:输出为整型 样例 1 输入: …

全量知识系统“全基因序列” 的百度AI答问 之1

在您所描述的框架下,我们可以开始探索“知识”实体的起点以及如何认识它。首先,让我们明确一下“实体”的定义和性质。实体,在哲学和许多其他学科中,通常被理解为存在于我们世界中的具体事物或抽象概念。它们可以是物理的&#xf…

Flink 集群部署模式

文章目录 前言一、会话模式(Session Mode)二、单作业模式(Per-Job Mode)三、应用模式(Application Mode) 前言 Flink支持多种集群部署模式,以满足不同场景和需求。以下是Flink的主要集群部署模…

springboot多模块下swaggar界面出现异常(Knife4j文档请求异常)或者界面不报错但是没有显示任何信息

继上一篇博文,我们解决了多模块下扫描不到子模块的原因,建议先看上一个博客了解项目结构: springboot 多模块启动报错Field XXX required a bean of type XXX that could not be found. 接下来我们来解决swaggar异常的原因,我们成功启动项目…

QML 布局管理器之ColumnLayout

一.ColumnLayout讲解 QML中的ColumnLayout是一种布局元素,用于在垂直列中排列其子元素。它的主要使用下列附加属性: Layout.minimumWidth Layout.minimumHeight Layout.preferredWidth Layout.preferredHeight Layout.maximumWidth Layout.maximumHeight Layout.fil…

代码随想录算法训练营 Day25|回溯算法2

216.组合总和III 思路 按照回溯算法的逻辑,写代码。 递归函数的参数,除了原有的n, k, startIndex,增加一个sum,计算当前path中的和。 终止条件用sum与n比较,如果满足相等,且满足长度为k,则加入…

WPF-后台设置控件Background

有时候需要在后台设置控件的背景 方法1: Btn_SendNeedle_Admin.Content "送针结束"; Btn_SendNeedle_Admin.Background new SolidColorBrush((Media.Color)Media.ColorConverter.ConvertFromString("#AAFFFFFF")); 方法2: Btn…

SqlServer2008(R2)(一)SqlServer2008(R2)经典宝藏操作收集整理

一、常见操作 1、TRUNCATE TABLE 语句 删除表数据 TRUNCATE TABLE语句比DELET删除表中的所有行更快。从逻辑上讲,TRUNCATE TABLE它类似于DELETE没有WHERE子句的语句。 TRUNCATE TABLE语句从表中删除所有行,但表结构及其列,约束,…

JSON 配置文件

JSON 配置文件的作用 JSON 是一种数据格式,在实际开发中, JSON 总是以配置文件的形式出现。小程序项目中也不例外:通过不同的 .json 配置文件,可以对小程序项目进行不同级别的配置。 小程序项目中有 4 种 json 配置文件&#xff0…

1.AD域控如何强制删除不可以用域控服务器

(1)原因需求 (2)不可用的域控不删掉造成的问题 (3)实战配置步骤 第一步:连接登录到特定服务器 第二步:选择要删除域控所在的站点和名称 第三步:执行删除命令

Ubuntu 20.04 系统如何优雅地安装NCL?

一、什么是NCL? NCAR Command Language(NCL)是由美国大气研究中心(NCAR)推出的一款用于科学数据计算和可视化的免费软件。 它有着非常强大的文件输入和输出功能,可读写netCDF-3、netCDF-4 classic、HDF4、b…

Elasticsearch快速检索的法宝: 倒排索引

倒排索引(Inverted Index)是搜索引擎和信息检索系统中的一个关键数据结构,它允许快速进行全文搜索。在倒排索引中,文档的内容被分析并分割成一系列的词条(tokens),然后每个词条被映射到包含它的…

3048. 标记所有下标的最早秒数 I(补题 ,二分 正序 逆序)

3048. 标记所有下标的最早秒数 I 给你两个下标从 1 开始的整数数组 nums 和 changeIndices ,数组的长度分别为 n 和 m 。 一开始,nums 中所有下标都是未标记的,你的任务是标记 nums 中 所有 下标。 从第 1 秒到第 m 秒(包括 第…

Xinstall助力web唤起iOS,打破平台壁垒,实现无缝跳转

在移动互联网时代,web与App之间的跳转已成为用户日常使用中不可或缺的一部分。然而,对于iOS系统的用户来说,web唤起App的过程往往充满了挑战和不便。这时,Xinstall作为一款专业的移动开发者服务工具,为开发者们提供了解…

在taro开发小程序中,创建全局事件,更新各个tabbar页面数据,适用购物车更新,taro购物车数据同步

在 Taro 小程序开发中实现一个全局的订阅发布机制,可以让你在任何一个 TabBar 页面修改数据时,通知其他 TabBar 页面更新数据。这种机制可以通过自定义事件的方式来实现 步骤 1:创建全局事件管理器 首先,在你的小程序中创建一个…

Lua中文语言编程源码-第一节,更改llex.c词法分析器模块, 使Lua支持中文关键词。

源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的llex.c,是Lua的词法分析器模块。 增加中文保留字标识符列表,保留英文保留字标识符列表。 搜索“ORDER RESERVED”,将原始代码 …

微信小程序开发学习笔记——3.10【小案例】表单提交样式布局与model双向绑定

>>跟着b站up主“咸虾米_”学习微信小程序开发中,把学习记录存到这方便后续查找。 课程连接:3.10.【小案例】表单提交样式布局与model双向绑定_哔哩哔哩_bilibili 一、model简易双向绑定 简单双向绑定语法查阅:小程序框架 / 视图层 /…