美文网首页
Go语言写并发会比其他语言Bug更少吗?

Go语言写并发会比其他语言Bug更少吗?

作者: 周群力 | 来源:发表于2019-10-07 20:12 被阅读0次

今天读了篇分析Go语言并发Bugs的论文Understanding Real-World Concurrency Bugs in Go (中文版的可以直接看作者的博士论文 )

大致探讨的问题是:Go号称让并发编程更简单、写出来的并发程序更健壮,那么Go的CSP式写法真的比共享内存式的并发编程less error-prone吗?

为了探究这个问题,作者找了6个开源的Go语言写的开源项目,统计了历史上的171个bug,发现CSP写法一样很容易出Bug。统计数据可以直接看论文里的图表,有意思的是作者把Bug分类为阻塞类和非阻塞类,阻塞类Bug里,Message Passing引起的Bug比传统共享内存式写法引起的Bug更多(如图);非阻塞类Bug里,共享内存式写法引起的问题较多。


image.png

作者于是得出结论:message passing写法并不比共享内存写法less error-prone


image.png

感想:

  1. 有人指出这个归因逻辑有问题,要得出这样的结论得有同一个程序一份用CSP写、另一份用共享内存写,然后比较两者数据。Kubernetes那么大,全换成共享内存式写法说不定Bug更多呢
  2. 即使这个归因有问题,至少可以得出结论:CSP式写法可能不比共享内存式写法less error-prone。这样的结论也是有意义的。
  3. 想到个问题:相比于非阻塞式Bug,我们是否更应该关注阻塞式Bug?直觉上想,非阻塞式Bug顶多是数据竞争时出个业务逻辑Bug影响某个业务,但是阻塞式Bug不管是死锁还是阻塞导致goroutine泄漏,都更可能造成系统性的崩溃。没细想。
    //TODO
  4. 这种实证研究没必要执着于归因吧(上哪找同一个程序一份用A写一份用B写拿来做研究?实践中找不着这样的案例),更值得探讨的是Amdahl定律:怎么解决瓶颈?比如既然58%的阻塞式Bug是CSP写法写出来的、既然CSP写法容易出阻塞式Bug,那么怎么避免CSP写出阻塞Bug、怎么及时发现写出来的阻塞Bug?作者博士论文里讲他们搞了个静态检测,我不懂静态检测就没看:)
    5.作为Go programmer,可以看看论文里的Bug案例、Bug分类避免实践中踩坑,就当看Effective Java了

相关文章

  • Go语言写并发会比其他语言Bug更少吗?

    今天读了篇分析Go语言并发Bugs的论文Understanding Real-World Concurrency ...

  • Go语言简介

    Go语言简介 Go语言设计的初衷 针对其他语言的痛点进行设计并加入并发编程为大数据,微服务,并发而生的通用编程语言...

  • Go语言并发

    Go语言并发 Go语言级别支持协程,叫做goroutine Go 语言从语言层面支持并发和并行的开发操作 Go并发...

  • Go基础语法(九)

    Go语言并发 Go 是并发式语言,而不是并行式语言。 并发是指立即处理多个任务的能力。 Go 编程语言原生支持并发...

  • Go 并发原理

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数...

  • 14 Go并发编程(一):协程 —— Go并发的基本运行单元

    Go协程 1.什么是goroutine? Go在语言级别原生支持并发操作,这在现代众多基于线程并发的其他语言来看是...

  • Go并发

    并发和并行 Go是并发语言,而不是并行语言。(Go is a concurrent language and no...

  • GO语言初级学习之代码案例13 (QQ群聊)

    @(go语言 黑马)[GO语言] 并发聊天室 题目:利用Go语言高并发的特性,编写一个类似QQ群聊功能的并发聊天服...

  • Go并发

    Go语言中的并发编程 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很...

  • 第14章-并发性Concurrency

    并发性Concurrency 1.1 什么是并发 Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之...

网友评论

      本文标题:Go语言写并发会比其他语言Bug更少吗?

      本文链接:https://www.haomeiwen.com/subject/hknmpctx.html