golang
lessisbetter
LIB: lessisbetter.site
展开
-
轻松入门Golang pprof实用不忽悠
网上已搜索golang pprof,资料不少,简明高效的一个没看到,这篇文章5步教你用会pprof获取cpu和内存prof。第1步:安装易用的pprofgolang自带的prof包是runtime/pprof,这个是低级别的,需要你手动做一些设置等等周边工作,不利于我们快速上手,利用pprof帮助我们解决实际的问题。这里推荐davecheney封装的pprof,它可以1行代码,让你用上ppro...原创 2019-01-05 14:12:30 · 724 阅读 · 0 评论 -
Go调度器系列(2)宏观看调度器
上一篇文章《Go语言高阶:调度器系列(1)起源》,学goroutine调度器之前的一些背景知识,这篇文章则是为了对调度器有个宏观的认识,从宏观的3个角度,去看待和理解调度器是什么样子的,但仍然不涉及具体的调度原理。三个角度分别是:调度器的宏观组成调度器的生命周期GMP的可视化感受在开始前,先回忆下调度器相关的3个缩写:G: goroutine,每个G都代表1个goroutine...原创 2019-03-27 13:38:31 · 192 阅读 · 0 评论 -
Golang并发:再也不愁选channel还是选锁
周末又到了,为大家准备了一份实用干货:如何使用channel和Mutex解决并发问题,利用周末的好时光,配上音乐,思考一下吧原创 2019-01-14 20:30:54 · 12018 阅读 · 1 评论 -
如何优雅的处理Golang错误
在看《Go入门指南》的一种用闭包处理错误的模式时,里面提到了一种错误的优雅处理方式,减少我们重复写if err:=f(); err != nil{}式的代码,感觉很心动,做了下测试,结论如下:能减少if err式的代码,代码可以变清新整洁。使用存在限制:只有当错误需要结束调用时才可以使用这种方法,如果被调用函数返回错误,但调用者函数需处理错误后,向下继续执行,则不能采用这种方法。经常的...原创 2019-01-05 14:42:54 · 2581 阅读 · 0 评论 -
Go的map中删除子map,内存会自动释放吗?
对于频繁增删map的场景,我们很关心map的内存是否会自动释放。结论在Go中,map中存放map,上层map执行delete,子层map占用的内存会释放,无需手动先释放子map内存,再在上层map执行删除。实验在C++中,如果使用了map包含map的数据结构,当要释放上层map的某一项时,需要手动释放对应的子map占用的内存,而在Go中,垃圾回收让内存管理变得如此简单。做2个对比实验,...原创 2019-01-05 14:42:18 · 3938 阅读 · 3 评论 -
探索Golang定时器的陷阱
title: 探索Golang定时器的陷阱date: 2018-09-04 17:43:41tags: [‘Golang’, ‘定时器’]所谓陷阱,就是它不是你认为的那样,这种认知误差可能让你的软件留下隐藏Bug。刚好Timer就有3个陷阱,我们会讲1)Reset的陷阱和2)通道的陷阱,3)Stop的陷阱与Reset的陷阱类似,自己探索吧。Reset的陷阱在哪Timer.Reset()...原创 2019-01-05 14:40:40 · 251 阅读 · 0 评论 -
Golang并发的次优选择:sync包
我们都知道Golang并发优选channel,但channel不是万能的,Golang为我们提供了另一种选择:sync。通过这篇文章,你会了解sync包最基础、最常用的方法,至于sync和channel之争留给下一篇文章。sync包提供了基础的异步操作方法,比如互斥锁(Mutex)、单次执行(Once)和等待组(WaitGroup),这些异步操作主要是为低级库提供,上层的异步/并发操作最好选用通...原创 2019-01-05 14:25:01 · 307 阅读 · 0 评论 -
轻松检测Golang并发的数据竞争
Golang中我们使用Channel或者sync.Mutex等锁保护数据,有没有一种机制可以检测代码中的数据竞争呢?背景知识数据竞争是并发情况下,存在多线程/协程读写相同数据的情况,必须存在至少一方写。另外,全是读的情况下是不存在数据竞争的。使用race检测数据竞争go build有个标记race可以帮助检测代码中的数据竞争。➜ awesome git:(master) ✗ go ...原创 2019-01-05 14:25:28 · 3252 阅读 · 0 评论 -
一招教你无阻塞读写Golang channel
无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,教你一招再也不遇到channel阻塞的问题。这篇文章会介绍,哪些情况会存在阻塞,以及如何使用select解决阻塞。阻塞场景阻塞场景共4个,有缓存和无缓冲各2个。无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景:通道中无数据,但执行读通道。通道中无数据,向通道写数据,但无协程读取。// 场景1func Re...原创 2019-01-05 14:23:16 · 2378 阅读 · 1 评论 -
Golang并发模型:轻松入门协程池
goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理。但有时候,我们还是想控制一下。比如,我们有A、B两类工作,不想把太多资源花费在B类务上,而是花在A类任务上。对于A,我们可以来1个开一个goroutine去处理,对于B,我们可以使用一个协程池,协程池里有5个线程去处理B类任务,这样B消耗的资源就不会太多。控制使用资源并不是协程池目的,使...原创 2019-01-05 14:22:39 · 659 阅读 · 0 评论 -
Golang并发模型:select进阶
最近公司工作有点多,Golang的select进阶就这样被拖沓啦,今天坚持把时间挤一挤,把吹的牛皮补上。前一篇文章《Golang并发模型:轻松入门select》介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性。nil的通道永远阻塞如何跳出for-selectselect{}阻塞nil的通道永远阻塞当case上读一个通道时,如果这个通道是nil,则该case永远阻塞...原创 2019-01-05 14:21:48 · 336 阅读 · 0 评论 -
Golang并发模型:轻松入门select
之前的文章都提到过,Golang的并发模型都来自生活,select也不例外。举个例子:我们都知道一句话,“吃饭睡觉打豆豆”,这一句话里包含了3件事:妈妈喊你吃饭,你去吃饭。时间到了,要睡觉。没事做,打豆豆。在Golang里,select就是干这个事的:到吃饭了去吃饭,该睡觉了就睡觉,没事干就打豆豆。结束发散,我们看下select的功能,以及它能做啥。select功能在多个通道上进...原创 2019-01-05 14:21:02 · 214 阅读 · 0 评论 -
Golang并发模型:并发协程的优雅退出
goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。这篇文章介绍,如何合理的退出goroutine,减少软件bug。goroutine在退出方面,不像线程和进程,不能通过某种手段强制关闭它们,只能等待goroutine主动退出。但也无需为退出、关闭gor...原创 2019-01-05 14:19:55 · 646 阅读 · 0 评论 -
Golang并发模型:轻松入门流水线FAN模式
前一篇文章《Golang并发模型:轻松入门流水线模型》,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Golang并发,提高软件性能。但FAN模式不一定是万能,不见得能提高程序的性能,甚至还不如普通的流水线。我们先介绍下FAN模式,再看看它怎么提升性能的,它是不是万能的。FAN-IN和FAN-OUT模式Golang...原创 2019-01-05 14:18:45 · 374 阅读 · 0 评论 -
Golang并发模型:轻松入门流水线模型
Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文章,你会更好的使用Golang并发特性,提高你的程序性能。这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。Golang的并发核心思路Golang并发核心思路是关注数据流动。数据流动的过程交给c...原创 2019-01-05 14:17:37 · 335 阅读 · 0 评论 -
Golang的sync.WaitGroup陷阱
sync.WaitGroup是并发环境中,一个相当常用的数据结构,用来等待所有协程的结束,在写代码的时候都是按着例子的样子写的,也没用深究过它的使用。前几日想着能不能在协程中执行Add()函数,答案是不能,这里介绍下。陷阱在WaitGroup的3个函数的调用顺序上。先回顾下3个函数的功能:Add(delta int):给计数器增加delta,比如启动1个协程就增加1。Done():协程退出...原创 2019-01-05 14:15:15 · 1188 阅读 · 0 评论 -
实战Go内存泄露
最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用pprof定位内存泄露问题。关于Go的内存泄露有这么一句话不知道你听过没有:10次内存泄露,有9次是goroutine泄露。我所解决的问题,也是goroutine泄露导致的内存泄露,所以这篇文章主要介绍Go程序的...原创 2019-05-18 17:42:28 · 1331 阅读 · 1 评论