编辑推荐
适读人群:这《Go语言并发之道》适合已经了解Go语言,并有一些开发经验的人。我没有解释Go语言的基本语法。最好了解一些其他语言的并发编程,当然这并不是必须的。由于主题涵盖的范围较广,《Go语言并发之道》适合各个使用方向的读者。
《Go语言并发之道》作者带你一步一步深入这些方法。你将理解Go语言为何选定这些并发模型,这些模型又会带来什么问题,以及你如何组合利用这些模型中的原语去解决问题。学习那些让你在独立且自信的编写与实现任何规模并发系统时所需要用到的技巧和工具。
理解Go语言如何解决并发难以编写正确这一根本问题。
学习并发与并行的关键性区别。
深入到Go语言的内存同步原语。
利用这些模式中的原语编写可维护的并发代码。
将模式组合成为一系列的实践,使你能够编写大规模的分布式系统。
学习goroutine背后的复杂性,以及Go语言的运行时如何将所有东西连接在一起。
内容简介
《Go语言并发之道》作者带你一步一步深入这些方法。你将理解Go语言为何选定这些并发模型,这些模型又会带来什么问题,以及你如何组合利用这些模型中的原语去解决问题。学习那些让你在独立且自信的编写与实现任何规模并发系统时所需要用到的技巧和工具。
理解Go语言如何解决并发难以编写正确这一根本问题。
学习并发与并行的关键性区别。
深入到Go语言的内存同步原语。
利用这些模式中的原语编写可维护的并发代码。
将模式组合成为一系列的实践,使你能够编写大规模的分布式系统。
学习goroutine背后的复杂性,以及Go语言的运行时如何将所有东西连接在一起。
作者简介
KatherineCox-Buday是一名计算机科学家,目前工作于Simpleonlinebanking。她的业余爱好包括软件工程、创作、Go语言(igo、baduk、weiquei)以及音乐,这些都是她长期的追求,并且有着不同层面的贡献。
目录
前言1
第1章并发概述9
摩尔定律,WebScale和我们所陷入的混乱10
为什么并发很难?12
竞争条件13
原子性15
内存访问同步17
死锁、活锁和饥饿20
确定并发安全28
面对复杂性的简单性31
第2章对你的代码建模:通信顺序进程33
并发与并行的区别33
什么是CSP37
如何帮助你40
Go语言的并发哲学43
第3章Go语言并发组件47
goroutine47
sync包58
WaitGroup58
互斥锁和读写锁60
cond64
once69
池71
channel76
select语句92
GOMAXPROCS控制97
小结98
第4章Go语言的并发模式99
约束99
for-select循环103
防止goroutine泄漏104
or-channel109
错误处理112
pipeline116
构建pipeline的最佳实践120
一些便利的生成器126
扇入,扇出132
or-done-channel137
tee-channel139
桥接channel模式140
队列排队143
context包151
小结168
第5章大规模并发169
异常传递169
超时和取消178
心跳184
复制请求197
速率限制199
治愈异常的goroutine215
小结222
第6章goroutine和Go语言运行时223
工作窃取223
窃取任务还是续体231
向开发人员展示所有这些信息240
尾声240
附录A241前言/序言
前言
嘿,欢迎阅读《Go语言并发之道》!很高兴你已经拿起这《Go语言并发之道》开始阅读,非常期待在接下来的6章中和你一起探索关于Go语言并发编程的主题。
Go语言是一种美妙的语言。当它被创造并首次公开的时候,我带着极大的兴趣探索它:简洁、编译速度飞快、运行稳定、支持鸭子类型(ducktyping),让我高兴的是,它原生支持并发。当我第一次使用“go关键字”创建一个goroutine的时候,(我保证)我开心得只剩傻笑了。我曾经用其他一些编程语言写过并发程序,但我从未用过像Go语言这样这么容易实现并发的语言(我并不是说其他有这种特性的语言不存在,只是我没用过)。我已经找到了我的Go语言最佳实践。
在过去的几年里,我用Go语言写个人的脚本和项目,直到发现自己已经可以在成千上万行代码的项目中畅游。随着语言的不断发展和社区的不断壮大,我们一起找到了Go语言并发编程的最佳实践。一些人就他们找到的模式进行讨论,但在社区里还没有如何使用Go语言并发编程的综合指南。
正是考虑到这一点,我才决定写这《Go语言并发之道》。我希望可以让社区了解到关于Go语言并发编程的一些全面且高质量的信息:如何使用,最佳实践,以及如何将它集成到你的系统中,还有它背后的工作原理。我竭尽全力均衡这些关注点。我希望这是一本对你有益的书。