一周 Go World 新鲜事-2019W08

01

Go内存模型&Happen-Before(一)


Go语言的内存模型规定了一个goroutine可以看到另外一个goroutine修改同一个变量的值的条件,这类似java内存模型中内存可见性问题。

当多个goroutine并发同时存取同一个数据时候必须把并发的存取的操作顺序化,在go中可以实现操作顺序化的工具有高级的通道(channel)通信和同步原语比如sync包中的Mutex(互斥锁)、RWMutex(读写锁)或者和sync/atomic中的原子操作。

当程序里面只有一个goroutine时候,虽然编译器和CPU由于开启了优化功能可能调整读写操作的顺序,但是这个调整是不会影响程序的执行正确性:

a := 1//1
b := 2//2
c := a + b //3
...

如上代码由于编译器和cpu的优化,实际运行时候可能代码(2)先运行,然后代码(1)后执行,但是由于代码(3)依赖代码(1)和代码(2)创建的变量,所以代码(1)和(2)不会被放到代码(3)后运行,也就是说编译器和CPU在不改变程序正确性的前提下才会对指令进行重排序,所以上面代码在单一goroutine时候并不会存在问题,也就是在单一goroutine 中Happens Before所要表达的顺序就是程序执行的顺序。


原文链接:

http://ifeve.com/go-memhappen-before%EF%BC%88%E4%B8%80%EF%BC%89/

原文二维码:

640?wx_fmt=png




02

golang中Context的使用场景


context在Go1.7之后就进入标准库中了。它主要的用处如果用一句话来说,是在于控制goroutine的生命周期。当一个计算任务被goroutine承接了之后,由于某种原因(超时,或者强制退出)我们希望中止这个goroutine的计算任务,那么就用得到这个Context了。关于Context的四种结构,CancelContext、TimeoutContext、DeadLineContext、ValueContext的使用在这一篇快速掌握 Golang context 包已经说的很明白了。本文主要来盘一盘golang中context的一些使用场景。


原文链接:

https://mp.weixin.qq.com/s/xbDFN-JhTIQ4xWanEC1Bxw

原文二维码:

640?wx_fmt=png




03

golang协程池设计



go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在golang net/http包中,每一个被监听到的tcp链接都是由一个groutine去完成处理其上下文的,由此使得其拥有极其优秀的并发量吞吐量。

for {
       // 监听tcp
       rw, e := l.Accept()
       if e != nil {
           .......
       }
       tempDelay = 0
       c := srv.newConn(rw)
       c.setState(c.rwc, StateNew) // before Serve can return
       // 启动协程处理上下文
       go c.serve(ctx)
}

虽然创建一个groutine占用的内存极小(大约2KB左右,线程通常2M左右),但是在实际生产环境无限制的开启协程显然是不科学的,比如上图的逻辑,如果来几千万个请求就会开启几千万个groutine,当没有更多内存可用时,go的调度器就会阻塞groutine最终导致内存溢出乃至严重的崩溃,所以本文将通过实现一个简单的协程池,以及剖析几个开源的协程池源码来探讨一下对groutine的并发控制以及多路复用的设计和实现。


原文链接:

https://segmentfault.com/a/1190000018193161

原文二维码:

640?wx_fmt=png




04

TiDB 在摩拜单车的深度实践及应用


摩拜单车 2017 年开始将 TiDB 尝试应用到实际业务当中,根据业务的不断发展,TiDB 版本快速迭代,我们将 TiDB 在摩拜单车的使用场景逐渐分为了三个等级:

  • P0 级核心业务:线上核心业务,必须单业务单集群,不允许多个业务共享集群性能,跨 AZ 部署,具有异地灾备能力。

  • P1 级在线业务:线上业务,在不影响主流程的前提下,可以允许多个业务共享一套 TiDB 集群

  • 离线业务集群:非线上业务,对实时性要求不高,可以忍受分钟级别的数据延迟。

本文会选择三个场景,给大家简单介绍一下 TiDB 在摩拜单车的使用姿势、遇到的问题以及解决方案。


原文链接:

https://mp.weixin.qq.com/s/tXlli0-egrzXiX1__GuMPA

原文二维码:

640?wx_fmt=png




05

k8s 中定时任务的实现


k8s 中有许多优秀的包都可以在平时的开发中借鉴与使用,比如,任务的定时轮询、高可用的实现、日志处理、缓存使用等都是独立的包,可以直接引用。本篇文章会介绍 k8s 中定时任务的实现,k8s 中定时任务都是通过 wait 包实现的,wait 包在 k8s 的多个组件中都有用到。

golang 中可以通过 time.Ticker 实现定时任务的执行,但在 k8s 中用了更原生的方式,使用 time.Timer 实现的。time.Ticker 和 time.Timer 的使用区别如下:

  • ticker 只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会自动触发。

  • timer 定时器是到了固定时间后会执行一次,仅执行一次

  • 如果 timer 定时器要每隔间隔的时间执行,实现 ticker 的效果,使用 func (t *Timer) Reset(d Duration) bool


原文链接:

https://www.jianshu.com/p/83eb85d53382

原文二维码:

640?wx_fmt=png



职位推荐:


【上海】积梦智能科技招聘Go工程师 


来积梦智能

 Gopher China 创始人共事

接受其亲自指导

大牛云集的办公环境

花钱也买不到的专业培训


640?wx_fmt=png

长按图片识别二维码了解招聘详情


640?

Gopher China 2019 最新资讯


640?wx_fmt=jpeg


【重磅】Gopher China 2019 大会讲师及议题揭晓


重磅!会前一天培训讲师揭晓:Dave&William


探探Gopher China 2019大会全面启动


下周将陆续给大家带来本次 Gopher China 大会的讲师专访,敬请期待哦~


Gopher China 2019 大会火热售票中~~


戳下方“ 阅读原文 ”即可报名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值