有没有哪里能通俗易懂地讲明白 Go 的并发? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
zhoudaiyu
V2EX    Go 编程语言

有没有哪里能通俗易懂地讲明白 Go 的并发?

  •  
  •   zhoudaiyu
    PRO
    2021-02-05 20:07:04 +08:00 via iPhone 3494 次点击
    这是一个创建于 1708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    什么 channel mutex 看的脑袋都蒙了,谁说 go 并发容易了

    17 条回复    2021-02-07 16:13:59 +08:00
    rrfeng
        1
    rrfeng  
       2021-02-05 20:14:01 +08:00
    你先说哪里不动
    lewis89
        2
    lewis89  
       2021-02-05 20:17:26 +08:00   1
    没有什么办法可以让你通俗易懂,真的,能写 go 调度器的人 至少得会以下几个技能

    各平台的汇编以及栈结构(不然你真不知道协程调度是如何完成上下文切换的 以及如何实现动态栈伸缩)
    操作系统信号机制 (不然你真的不知道如何实现抢断式调度)
    monitor 锁 (不然你真的不知道多线程如何通信 如何同步)
    调度算法 (不然你真的不知道如何调度)

    建议还是老老实实先读 CSAPP 现代操作系统原理 这两本书
    lewis89
        3
    lewis89  
       2021-02-05 20:18:20 +08:00
    @lewis89 #2

    还有 Linux 常见的 IO 模型 以及多路 IO 复用技术
    zhoudaiyu
        4
    zhoudaiyu  
    OP
    PRO
       2021-02-05 20:21:31 +08:00 via iPhone
    @rrfeng 看烦了主要是
    zhoudaiyu
        5
    zhoudaiyu  
    OP
    PRO
       2021-02-05 20:22:24 +08:00 via iPhone
    @lewis89 主要是协程这块弄懂了就行了
    shoaly
        6
    shoaly  
       2021-02-05 20:24:18 +08:00
    不是 go 的问题, 而是并发本身的模型 老哥要理解 ..
    不然你随便看那个预言的线程, 或者协程都吃力...
    lewis89
        7
    lewis89  
       2021-02-05 20:24:20 +08:00   1
    如果你没有听说过 syscall rsp rbp ip fastcall ABI 信号中断 多路 IO 复用 stackfull 这些概念或者名词 还是老老实实打基础吧..

    打好了自然就明白了 ,能写的 go 的人 牛逼之处不是他用 go 语言编程有厉害,而在于能写 go 的这个人对计算机体系结构有多深刻的认识..
    lewis89
        8
    lewis89  
       2021-02-05 20:26:11 +08:00
    @zhoudaiyu #5 你要弄懂协程 自然要弄懂 如何上下文切换.. 深入到细节 就又回到计算机体系结构了,又让你回到最底层了,因为一个很简单的问题,为什么要用协程,我们有好好的线程模型不用.. 你要解释这个 没点基础功夫 是不行的
    lewis89
        9
    lewis89  
       2021-02-05 20:28:13 +08:00
    @zhoudaiyu #5 你要完全弄懂,自己用 C 语言手动实现一个协程,然后配合 epoll 多路复用 就能明白 goroutine 了
    zhoudaiyu
        10
    zhoudaiyu  
    OP
    PRO
       2021-02-05 20:34:38 +08:00
    @lewis89 估计重学要 1 、2 年才行。。不过我确实非常非常想把基础弄牢固,就是一直没找到很好的切入点,怕半途而废
    misaka19000
        11
    misaka19000  
       2021-02-05 20:52:26 +08:00   1
    Dongxiem
        12
    Dongxiem  
       2021-02-07 00:52:37 +08:00
    按照楼主这条问题,楼主应该多了解一些计算机底层的知识、操作系统等内容,因为高级语言都有共性的,深入理解的话还是要回到前面的内容。
    Dongxiem
        13
    Dongxiem  
       2021-02-07 00:54:54 +08:00
    @Dongxiem 这里有一个推荐,图解形式讲解计算机内容和 Golang 的知识,可以搜索:幼麟实验室。
    baiyi
        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
    zhoudaiyu
        15
    zhoudaiyu  
    OP
    PRO
       2021-02-07 12:52:25 +08:00 via iPhone
    @baiyi 最后一个太棒了吧,你们都是怎么找到这种资源的啊
    baiyi
        16
    baiyi  
       2021-02-07 13:16:03 +08:00
    @zhoudaiyu #15 Google 搜啊,找到相关的文章就进去看,碰到不懂的知识点就再搜下一个知识点。

    我当时对 go 的并发感兴趣,所以入的坑,看了一个多月的并发、调度器相关的内容。中文的 go 调度器相关的资料挺多的,但都是鹦鹉学舌,翻来覆去就是 GMP 这点东西,没几个深入的。幸好最后找到了欧神的书,虽然当时我看的时候还有些小瑕疵,但看的特别顺畅,调度器部分从头到尾的逻辑特别顺,他博客里说这叫线性写作。

    如果你对这方面感兴趣,我的建议就是先看看 RobPike 的演讲,听听他们设计 Go 语言的时候是如何思考并发的。然后就跟着书看下去就行了。
    xkeyideal
        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 的执行这个就要求就比较高了,遇到有些复杂的业务逻辑,还要会设计整个并发的流程配合一些奇技淫巧提高执行效率,那么这个就在于各种基本功了,与语言没有什么太大关系了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     898 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    Wrld is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 20:48 PVG 04:48 LAX 13:48 JFK 16:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86