Ezreal 书架 Ezreal 书架
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
  • 逃逸分析

  • 延迟语句

  • 数据容器

  • 通道

    • CSP是什么
    • 通道有哪些应用
    • 通道的底结构
    • 通道的关闭过程发生了什么
    • 从一个关闭的通道里仍然能读出数据吗
    • 如何优雅地关闭通道
    • 关于通道的 happens-before 有哪些
    • 通道在什么情况下会引起资源泄漏
    • 通道操作的情况总结
  • 接口

  • unsafe

  • context

  • Go程序员面试笔试宝典
  • 通道
ezreal_rao
2023-05-05

CSP是什么

Go 有一句经典的格言: Do not communicate by sharing memory; instead, share memory by communicating. 不要通过共享内存来通信,而要通过通信来实现内存共享。这也是 Go 的并发哲学,它依赖 CSP 模型,基于 goroutine 和 channel 实现。

CSP 通常被认为是 Go 语言在并发编程上取得成功的关键因素。CSP 全称是 “Communicating Sequential Processes”,这也是 C.A.R Hoare 在 1978 年发表在 ACM 的一篇论文的主题。论文里指出一门编程语言应该重视 input 和 output,尤其是注重并发编程。

在那篇文章发表的时代,人们正在研究模块化编程的思想,该不该用 goto 语句在当时是最激烈的议题。彼时,面向对象编程的思想正在崛起,几乎没什么人关心并发编程。

在文章中, CSP 也是一门自定义的编程语言, 作者定义了用于过程(process)间的通信 (communicatiton)的输入输出语句。 Process 需要输入驱动, 并且产生输出, 供其他 process 消费, process 可以是进程、线程、甚至是代码块。 输入命令是:!, 用来向 process 写入;输出 是:?,用来从 process 读出。channel 正是借鉴了这一设计。

Hoare 还提出了一个 -> 命令,如果 -> 左边的语句返回 false,那它右边的语句就不会执行。

通过这些输入输出命令,Hoare 证明了如果一门编程语言中把过程间的通信看得第一等重要, 那么并发编程的问题就会变得简单。

Go 语言则进一步将 CSP 发扬光大。尽管内存同步访问控制(memory access synchronization) 在某些情况下大有用处,Go 语言也有相应的 sync 包支持,但是用在大型程序中还是很容易出错。因此 Go 一开始就把 CSP 的思想融入语言的核心里,所以并发编程成为 Go 的一个独特的优势,而且很容易理解。

大多数的编程语言的并发编程模型是基于线程和内存同步访问控制,Go 的并发编程的模型则 用 goroutine 和 channel 来替代。goroutine 和线程类似,channel 则和 mutex(用于内存同步访问控制)类似。

goroutine 解放了程序员,让他们更能贴近业务去思考问题。而不用考虑各种像线程库、线程开销、线程调度等这些烦琐的底层问题,goroutine 天生就把这些问题解决好了。

channel 则天生就可以和其他 channel 组合,可以把各种收集各种子系统结果的 channel 输入到同一个 channel。channel 还可以和 select, cancel, timeout 结合起来,而 Mutex 就没有这些功能。

Go 的并发原则非常优秀,目标很简单:尽量使用 channel;把 goroutine 当作免费的资源,随便使用。

#通道#csp#channel
上次更新: 5/9/2023, 10:58:32 AM
散列表map
通道有哪些应用

← 散列表map 通道有哪些应用→

最近更新
01
为什么我的MySQL会抖一下
07-15
02
HTTP 性能优化面面观
07-12
03
WebSocket:沙盒里的 TCP
07-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Ezreal Rao | CC BY-NC-SA 4.0
豫ICP备2023001810号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式