Go语言并发之道

第一章:并发概述

1、Amdahl定律:使用并行方式可以解决的问题,可以使用这种方法对其潜在的性能收益进行建模。简言之,它指出,收益的限制取决于有多少程序必须以顺序的方式编写。

2、竞争条件:当两个或者多个操作必须按正确的顺序执行,而程序并未保证这个顺序就会发生竞争条件。

大多数情况下,这将在所谓的数据中出现,其中一个并发操作尝试读取一个变量,而在某个不确定的时间,另一个并发操作试图写入同一个变量。

竞争条件是最难发现的并发bug类型之一。

 

3、原子性:意味着在它运行的环境中,它是不可分割的或不可中断的。原子性隐含的意思是它在并发环境中是安全的。

操作的原子性可以根据当前定义的范围而改变。

如果一个数据存在竞争,那么改程序的输出将是完全不确定的。

 

4、内存访问同步:程序中需要独占访问共享资源的部分有一个专有名词,叫临界区。

LOCK和UNLOCK虽解决了数据竞争,但并没有真正解决我们的竞争条件。lock的调用会使程序变慢,它也可能造成维护和性能问题。

 

5、死锁程序是所有并发进程彼此等待的程序。在这种情况下,如果没有外界的干预,这个程序将永远无法恢复。

Coffman条件是帮助检测、防止和纠正死锁的技术依据。

Coffman条件如下:

相互排斥:并发进程同时拥有资源的独占权

等待条件:并发进程必须同时拥有一个资源,并等待额外的资源。

没有抢占:并发进程拥有的资源只能被该进程释放,即可满足这个条件。

循环等待:一个并发进程(P1)必须等待一系列其他并发进程(P2),这些并发进程同时也在等待进程(P1),这样便满足了这个最终条件。

 

6、活锁:活锁是正在主动执行并发操作的程序,但是这些操作无法向前推进程序的状态。

 

7、内存溢出申请内存时,没有足够的内存空间供它使用。内存泄漏:申请内存后没有释放已申请的内存空间。

 

8、如果不关心并发 操作的结果,或者你有其他方法来手机它们的结果时,WaitGroup是等待并发操作完成的好方法

    如果这两个条件都不满足,建议使用channel和select语句。

可将WaitGroup视为一个并发安全的计数器调用通过传入的整数执行add方法增加计数器的增量,并调用Done方法对计数器今夕递减。Wait阻塞,直到计数器为零。

 

9、临界区是程序中需要独占访问共享资源的区域。Mutex提供了一种安全的方式来表示对这些共享资源的独占访问。进入和退出临界区是有消耗的,需尽量减少在临界区的时间,互斥锁的策略是减少临界区的范围。

sync.RWMutex在概念上和互斥是一样的:它保护着对内存的访问。任意数量的读消费者可以持有一个读锁,只要没有其他事物持有一个写锁。

 

10、sync.Once是一种类型,它在内部使用一些sync原语,以确保即使在不同的goroutine上,也只会调用一次Do方法处理传递进来的方法。

    sync只计算调用Do方法的次数,而不是多少次唯一调用Do方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本书作者带你一步一步深入这些方法。你将理解 Go语言为何选定这些并发模型,这些模型又会带来什么问题,以及你如何组合利用这些模型中的原语去解决问题。学习那些让你在独立且自信的编写与实现任何规模并发系统时所需要用到的技巧和工具。 理解Go语言如何解决并发难以编写正确这一根本问题。 学习并发与并行的关键性区别。 深入到Go语言的内存同步原语。 利用这些模式中的原语编写可维护的并发代码。 将模式组合成为一系列的实践,使你能够编写大规模的分布式系统。 学习 goroutine 背后的复杂性,以及Go语言的运行时如何将所有东西连接在一起。 作者简介 · · · · · · Katherine Cox-Buday是一名计算机科学家,目前工作于 Simple online banking。她的业余爱好包括软件工程、创作、Go 语言(igo、baduk、weiquei) 以及音乐,这些都是她长期的追求,并且有着不同层面的贡献。 目录 · · · · · · 前言 1 第1章 并发概述 9 摩尔定律,Web Scale和我们所陷入的混乱 10 为什么并发很难? 12 竞争条件 13 原子性 15 内存访问同步 17 死锁、活锁和饥饿 20 确定并发安全 28 面对复杂性的简单性 31 第2章 对你的代码建模:通信顺序进程 33 并发与并行的区别 33 什么是CSP 37 如何帮助你 40 Go语言并发哲学 43 第3章 Go语言并发组件 47 goroutine 47 sync包 58 WaitGroup 58 互斥锁和读写锁 60 cond 64 once 69 池 71 channel 76 select 语句 92 GOMAXPROCS控制 97 小结 98 第4章 Go语言并发模式 99 约束 99 for-select循环103 防止goroutine泄漏 104 or-channel 109 错误处理112 pipeline 116 构建pipeline的最佳实践 120 一些便利的生成器 126 扇入,扇出 132 or-done-channel 137 tee-channel 139 桥接channel模式 140 队列排队143 context包 151 小结 168 第5章 大规模并发 169 异常传递169 超时和取消 178 心跳 184 复制请求197 速率限制199 治愈异常的goroutine 215 小结 222 第6章 goroutine和Go语言运行时 223 工作窃取223 窃取任务还是续体 231 向开发人员展示所有这些信息 240 尾声 240 附录A 241

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值