Golang Go语言中有没有哪里能通俗易懂地讲明白并发?
Golang Go语言中有没有哪里能通俗易懂地讲明白并发?
什么 channel mutex 看的脑袋都蒙了,谁说 go 并发容易了😂
没有什么办法可以让你通俗易懂,真的,能写 go 调度器的人 至少得会以下几个技能
各平台的汇编以及栈幁结构(不然你真不知道协程调度是如何完成上下文切换的 以及如何实现动态栈伸缩)
操作系统信号机制 (不然你真的不知道如何实现抢断式调度)
monitor 锁 (不然你真的不知道多线程如何通信 如何同步)
调度算法 (不然你真的不知道如何调度)
建议还是老老实实先读 CSAPP 现代操作系统原理 这两本书
#2
还有 Linux 常见的 IO 模型 以及多路 IO 复用技术
看烦了主要是
主要是协程这块弄懂了就行了
不是 go 的问题, 而是并发本身的模型 老哥要理解 …
不然你随便看那个预言的线程, 或者协程都吃力…
如果你没有听说过 syscall rsp rbp ip fastcall ABI 信号中断 多路 IO 复用 stackfull 这些概念或者名词 还是老老实实打基础吧…
打好了自然就明白了 ,能写的 go 的人 牛逼之处不是他用 go 语言编程有厉害,而在于能写 go 的这个人对计算机体系结构有多深刻的认识…
#5 你要弄懂协程 自然要弄懂 如何上下文切换… 深入到细节 就又回到计算机体系结构了,又让你回到最底层了,因为一个很简单的问题,为什么要用协程,我们有好好的线程模型不用… 你要解释这个 没点基础功夫 是不行的
#5 你要完全弄懂,自己用 C 语言手动实现一个协程,然后配合 epoll 多路复用 就能明白 goroutine 了
估计重学要 1 、2 年才行。。不过我确实非常非常想把基础弄牢固,就是一直没找到很好的切入点,怕半途而废
按照楼主这条问题,楼主应该多了解一些计算机底层的知识、操作系统等内容,因为高级语言都有共性的,深入理解的话还是要回到前面的内容。
这里有一个推荐,图解形式讲解计算机内容和 Golang 的知识,可以搜索:幼麟实验室。
如果只是想了解 golang 的并发而不是想看源码学习调度器的话,可以看看 Rob Pike 的演讲:《 Go Concurrency Patterns 》
这篇博客的配图很好:《 Visualizing Concurrency in Go 》 https://divan.dev/posts/go_concurrency_visualize/
如果是想看调度器部分源码,深刻了解 golang 的 goroutine,我推荐《 Go: Under The Hood 》,虽然欧神还没写完整本,但调度器部分已经很完善了。https://github.com/golang-design/under-the-hood
最后一个太棒了吧,你们都是怎么找到这种资源的啊
#15 Google 搜啊,找到相关的文章就进去看,碰到不懂的知识点就再搜下一个知识点。
我当时对 go 的并发感兴趣,所以入的坑,看了一个多月的并发、调度器相关的内容。中文的 go 调度器相关的资料挺多的,但都是鹦鹉学舌,翻来覆去就是 GMP 这点东西,没几个深入的。幸好最后找到了欧神的书,虽然当时我看的时候还有些小瑕疵,但看的特别顺畅,调度器部分从头到尾的逻辑特别顺,他博客里说这叫线性写作。
如果你对这方面感兴趣,我的建议就是先看看 RobPike 的演讲,听听他们设计 Go 语言的时候是如何思考并发的。然后就跟着书看下去就行了。
mutex 是用来解决竞争防止死锁的,任何语言都一样,没有什么套路
Go 的并发指的的 goroutine,而并发之间的通信才用的是 channel
如果协程之间不需要数据通信,那么就不需要使用 channel,这种代码入门级别的时候随便写,高阶的时候注意 goroutine 泄漏即可,但不使用 channel 的协程基本不存在
goroutine+channel 的组合才是 Go 完整的并发,其实就是一个生产者消费者模型,Go 又限制的必须先有消费者才能运行生产者,否则阻塞性 channel 会报错,非阻塞性没事
而用来控制 goroutine 的泄漏的方法一般有两种方式:context 与 channel+sync.WaitGroup,现在推荐使用 context,但个人还是喜欢用后者
另:Go 的并发确实很容易,指的是入门,但想写好,没有 goroutine 泄漏,不发生死锁,从容的控制 goroutine 的执行这个就要求就比较高了,遇到有些复杂的业务逻辑,还要会设计整个并发的流程配合一些奇技淫巧提高执行效率,那么这个就在于各种基本功了,与语言没有什么太大关系了
在Golang(Go语言)中,并发是一个核心概念,可以通过以下通俗易懂的方式来理解:
一、Goroutine(协程)
- 定义:Goroutine是Go语言中的轻量级线程,可以理解为一种并发执行的函数。
- 特点:创建成本低,Go运行时可以同时处理数千个goroutine。
- 用法:通过
go
关键字启动一个新的goroutine。
二、Channel(通道)
- 定义:Channel是Go语言中用于在goroutine之间进行安全数据传输和同步的机制。
- 类型:分为无缓冲和有缓冲两种。
- 用法:使用
make
函数创建通道,并使用<-
操作符发送和接收数据。
三、同步机制
- WaitGroup:用于等待一组goroutine执行完成。通过
Add
方法增加计数器,Done
方法减少计数器,Wait
方法阻塞直到计数器为零。 - Mutex:互斥锁,用于保护共享资源,确保在任意时刻只有一个goroutine可以访问该资源。使用
Lock
方法加锁,Unlock
方法解锁。
这些概念和工具共同构成了Go语言强大的并发编程模型。通过学习这些基础知识,你可以更好地理解和应用Go语言中的并发特性,从而编写出高效、可扩展的并发程序。