当前位置:首页 > 文章列表 > Golang > Go教程 > Go语言CSP:通信顺序进程简述

Go语言CSP:通信顺序进程简述

来源:云海天教程 2023-02-17 16:58:16 0浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Go语言CSP:通信顺序进程简述》,聊聊并发,希望可以帮助到正在努力赚钱的你。

当进行和 Go语言有关讨论的时候,经常听到人们抛出 CSP 这个缩写。在某些环境下 CSP 经常被赞美成 Go语言成功的原因以及并发编程的“万能钥匙”。它让不知道 CSP 的人开始认为计算机科学已经发现了一些可以像变魔术一样的方法让编写一个并发程序像编写一个串行程序一样简单。

虽然 CSP 确实使这些变得更加简单,让程序变得更加健壮,但不幸的是它并不是一个奇迹。所以,CSP 到底是什么?为什么把大家都弄的如此兴奋?

CSP 即“Communicating Sequential Processes”(通信顺序进程),既是一个技术名词,也是介绍这种技术的论文的名字。在 1978 年,Charles Antony Richard Hoare 在 Association for Computing Machinery(一般被称作 ACM)中发表的论文。

在这篇论文里,Hoare 认为输入与输出是两个被忽略的编程原语,尤其是在并发代码中。在 Hoare 写作这篇论文的同时,关于如何架构程序的相关研究还在进行中,但是大部分的研究都是针对编写顺序代码的方能:goto 语句的使用正在被讨论,面向对象范型正在成为编程的基石。

并发操作并没有被给予过多的思考。Hoare 开始纠正这个现象,所以,关于 CSP 的这篇论文就横空出世了。

在 1978 年的论文中,CSP 仅是一个完全用来展示通信顺序进程的能力的一个简单的编程语言。事实上,他甚至在论文中写道:因此,本文介绍的概念和符号应该······不被认为适合作为一种编程语言,无论是抽象的还是具体的编程。

Hoare 深深的忧虑所展示的技术对未来的关于并发编程的研究没有任何作用,这种技术也许没有语言会真的按照他的想怯来实现。在接下来的 6 年里,关于 CSP 的想法被提炼成了一个叫做“进程微积分”的正式名称来将 CSP 的想也投入到并发编程的实践。

进程微积分是一种对并发系统进行数学化建模的方式,并且提供了代数也则来进行这些系统的变换来分析它们不同的属性,例如:并发与效率。而且正是因为 CSP 的原始论文以及从论文中进化而来的原语正是 Go语言并发模型的主要灵感,而这正是我们接下来所要聚焦的。

用来支撑他关于输入与输出需要被按照语言的原话来考虑,Hoare 的 CSP 编程语言包含用来建模输入与输出,或者说“在进程间正确通信”(这就是论文名字的由来)的原语。Hoare 将进程这个术语运用到任何包含需要输入来运行且产生其他进程将会消费的输出的逻辑片段。Hoare 可能应该使用“函数”这个词汇,而不是在他写论文时在社区中关于如何构建程序的辩论。

为了在进程之间进行通信,Hoare 创造了输入与输出的命令:! 代表发送输入到一个进程,? 代表读取一个进程的输出。每一个指令都需要指定具体是一个输出变量(从一个进程中读取一个变量的情况),还是一个目的地(将输入发送到一个进程的情况)。

有时,这两种方怯会引用相同的东西,在这种情况下,这两个过程会被认为是相对应的。换言之,一个进程的输出应该直接流向另一个进程的输入。下表给我们展示了 Hoare 的 CSP 论文申一些例子的摘录。

操作解释cardreader?card image从 cardreader 中读取一条记录,并将它的值(一个数组)赋给变量 cardimagelineprinter!line image向 lineprinter 发送 lineimage 的值x?(x, y)从名为 X 的进程输入一对值,并将它们分配给 x 和 yDIV!(3*a+b,13)处理 DIV,输出两个指定的值*[c:character;读取所有 west 输出的字符,然后输出到 east。当过程 west 结束时west?c → east!c]终止
示例与 Go语言的 channel 的相似性是显而易见的。注意最后一个示例中 west 的输出被送到一个变量 c,然后 east 的输入也是从相同的变量中接收的。这两个过程是相同的。

在 Hoare 关于 CSP 的第一篇论文中,进程只能通过命名的源与目的进行通信。他承认这会让代码像一个函数库一样被嵌入到逻辑中,因为这段代码的消费者必须知道输入与输出的命名。他随意地提出将输入输出的名字注册成他称作“端口名”的可能性,也就是说,在并行命令的头部,需要声明名字,也就是我们大概可以认为是命名的参数与命名的返回值。

这种语言同时利用了一个所谓的守护命令,也就是 Edgar Dijkstra 在一篇之前在 1974 年所写的论文中介绍的,“Guarded commands, nondeterminacy and formal derivation of programs”。一个有守护的命令仅仅是一个带有左和右倾向的语句,由 → 来分割。

左侧服务是有运行条件的,或者是守护右侧服务,如果左侧服务运行失败,或者在一个命令执行后,返回 false 或者退出,右侧服务永远不会被执行。将这些与 Hoare 的 I/O 命令组合起来,为 Hoare 的通信过程奠定了基础,从而实现了 channel。

使用这些原语, Hoare 运行了几个示例,并演示了如何以最佳的方式支持建模通信,从而使解决问题变得更简单、更容易理解。他使用的一些符号是简短的(Perl 程序员可能不同意),并且提出的问题有非常清晰的解决方案。类似的解决方案比较长一些,但也很清晰。

经验判断 Hoare 的建议是正确的,然而,有趣的是,在 Go语言发布之前,很少有语言能够真正地为这些原语提供支持。大多数流行的语言都支持共享和内存访问同步到 CSP 的消息传递样式。

当然也有例外,但不幸的是,这些都局限于没有广泛采用的语言。Go语言是最早将 CSP 的原则纳入其核心的语言之一,并将这种并发编程风格引人到大众中。它的成功也使得其他语言尝试添加这些原语。

在 Go语言中,甚至有时共享内存在某些情况下是合适的。但是,共享内存模型很难正确地使用,特别是在大型或复杂的程序中。正是由于这个原因,并发被认为是 Go语言的优势之一,它从一开始就建立在 CSP 的原则之上,因此很容易阅读、编写和推理。

本篇关于《Go语言CSP:通信顺序进程简述》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:云海天教程 如有侵犯,请联系study_golang@163.com删除
Go语言聊天服务器Go语言聊天服务器
上一篇
Go语言聊天服务器
Go语言封装qsort快速排序函数
下一篇
Go语言封装qsort快速排序函数
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    16次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    24次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    42次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码