什么 channel mutex 看的脑袋都蒙了,谁说 go 并发容易了😂
1
rrfeng 2021-02-05 20:14:01 +08:00
你先说哪里不动
|
2
lewis89 2021-02-05 20:17:26 +08:00 1
没有什么办法可以让你通俗易懂,真的,能写 go 调度器的人 至少得会以下几个技能
各平台的汇编以及栈幁结构(不然你真不知道协程调度是如何完成上下文切换的 以及如何实现动态栈伸缩) 操作系统信号机制 (不然你真的不知道如何实现抢断式调度) monitor 锁 (不然你真的不知道多线程如何通信 如何同步) 调度算法 (不然你真的不知道如何调度) 建议还是老老实实先读 CSAPP 现代操作系统原理 这两本书 |
6
shoaly 2021-02-05 20:24:18 +08:00
不是 go 的问题, 而是并发本身的模型 老哥要理解 ..
不然你随便看那个预言的线程, 或者协程都吃力... |
7
lewis89 2021-02-05 20:24:20 +08:00 1
如果你没有听说过 syscall rsp rbp ip fastcall ABI 信号中断 多路 IO 复用 stackfull 这些概念或者名词 还是老老实实打基础吧..
打好了自然就明白了 ,能写的 go 的人 牛逼之处不是他用 go 语言编程有厉害,而在于能写 go 的这个人对计算机体系结构有多深刻的认识.. |
8
lewis89 2021-02-05 20:26:11 +08:00
@zhoudaiyu #5 你要弄懂协程 自然要弄懂 如何上下文切换.. 深入到细节 就又回到计算机体系结构了,又让你回到最底层了,因为一个很简单的问题,为什么要用协程,我们有好好的线程模型不用.. 你要解释这个 没点基础功夫 是不行的
|
9
lewis89 2021-02-05 20:28:13 +08:00
@zhoudaiyu #5 你要完全弄懂,自己用 C 语言手动实现一个协程,然后配合 epoll 多路复用 就能明白 goroutine 了
|
10
zhoudaiyu OP @lewis89 估计重学要 1 、2 年才行。。不过我确实非常非常想把基础弄牢固,就是一直没找到很好的切入点,怕半途而废
|
11
misaka19000 2021-02-05 20:52:26 +08:00 1
|
12
Dongxiem 2021-02-07 00:52:37 +08:00
按照楼主这条问题,楼主应该多了解一些计算机底层的知识、操作系统等内容,因为高级语言都有共性的,深入理解的话还是要回到前面的内容。
|
14
baiyi 2021-02-07 11:37:28 +08:00 1
如果只是想了解 golang 的并发而不是想看源码学习调度器的话,可以看看 Rob Pike 的演讲:《 Go Concurrency Patterns 》 同样是 Rob Pike 的讲并发和并行区别的演讲:《 Concurrency is not Parallelism 》
这篇博客的配图很好:《 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 |
16
baiyi 2021-02-07 13:16:03 +08:00
@zhoudaiyu #15 Google 搜啊,找到相关的文章就进去看,碰到不懂的知识点就再搜下一个知识点。
我当时对 go 的并发感兴趣,所以入的坑,看了一个多月的并发、调度器相关的内容。中文的 go 调度器相关的资料挺多的,但都是鹦鹉学舌,翻来覆去就是 GMP 这点东西,没几个深入的。幸好最后找到了欧神的书,虽然当时我看的时候还有些小瑕疵,但看的特别顺畅,调度器部分从头到尾的逻辑特别顺,他博客里说这叫线性写作。 如果你对这方面感兴趣,我的建议就是先看看 RobPike 的演讲,听听他们设计 Go 语言的时候是如何思考并发的。然后就跟着书看下去就行了。 |
17
xkeyideal 2021-02-07 16:13:59 +08:00 2
mutex 是用来解决竞争防止死锁的,任何语言都一样,没有什么套路
Go 的并发指的的 goroutine,而并发之间的通信才用的是 channel 如果协程之间不需要数据通信,那么就不需要使用 channel,这种代码入门级别的时候随便写,高阶的时候注意 goroutine 泄漏即可,但不使用 channel 的协程基本不存在 goroutine+channel 的组合才是 Go 完整的并发,其实就是一个生产者消费者模型,Go 又限制的必须先有消费者才能运行生产者,否则阻塞性 channel 会报错,非阻塞性没事 而用来控制 goroutine 的泄漏的方法一般有两种方式:context 与 channel+sync.WaitGroup,现在推荐使用 context,但个人还是喜欢用后者 另:Go 的并发确实很容易,指的是入门,但想写好,没有 goroutine 泄漏,不发生死锁,从容的控制 goroutine 的执行这个就要求就比较高了,遇到有些复杂的业务逻辑,还要会设计整个并发的流程配合一些奇技淫巧提高执行效率,那么这个就在于各种基本功了,与语言没有什么太大关系了 |