golang
文章平均质量分 63
caoPengFlying
编程,学的是思维,写的是人生!
展开
-
雪花算法源码解析
雪花算法源码解析id的组成雪花算法的id由64位组成,总共分为4部分,第一部分只有一位,是正负标识位,没有其他作用,第二部分由41位的时间戳,第三部分为工作机器id,第四部分为自增序列号41位时间戳能表示毫秒级的时间为69年,意味着id在69年不重复(时钟不会滚)10位工作机器id,这个10位可以自由调整,可以用来表示业务12位自增序列号,表示同一毫秒内能生成的id的数量源码解析const ( nodeIDBits = uint64(10) sequenceBits = ui原创 2021-11-11 18:03:22 · 1040 阅读 · 0 评论 -
Go并发编程-Channel
Go并发编程-Channel Channel在Go中是first-class,其地位是非常重要的。在golang中,channel的使用是非常简单的。在Golang中流传一条有名的话Don’t communicate by sharing memory, share memory by communicating. 在业务的goroutine中,不要使用共享内存的方式通信,而是使用channel进行通信。简单用 channel使用make进行初始化,channel分为三种类型,双向c原创 2021-04-20 15:28:49 · 330 阅读 · 0 评论 -
Go并发编程-map
Go并发编程-map hash table的结构时日常开发中经常使用的,在go中内建了map的类型。本文介绍下在并发情况下的map使用map的常见错误map必须初始化后使用,否则会panic// 直接使用忘记初始化func main() { var m map[int]int m[100] = 100}// 结构体中忘记初始化type Counter struct { Website string Start time.Time PageCount原创 2021-04-19 21:45:32 · 401 阅读 · 0 评论 -
Go并发编程-SingleFlight
Go并发编程-SingleFlight SingleFlight是Go提供的一个扩展并发原语。作用是当多个goroutine同时调用一个函数时,只有一个goroutine在真实调用,其他的goroutine在阻塞等待这个goroutine返回,然后直接将第一个goroutine的结果返回。这样可以减少并发时的调用量。在实际的开发中面对大并发请求的场景,如果请求都是读请求可以使用这个合并请求的方式来降低服务的压力。简单用 同时开启1000个goroutine,通过count来控制耗时不同查询的请原创 2021-04-19 21:06:02 · 508 阅读 · 1 评论 -
Go并发编程-Semaphore
Go并发编程-Semaphore转自 :Go并发编程-Semaphore信号量就是用一个变量来控制并发能力。在高并发的情况下,资源是有限的,多个线程对于资源的申请和使用,当资源不足时需要阻塞等待,当有资源释放出来时需要通知阻塞等待的线程获取资源继续处理。P/V操作在信号量中有两个操作。P操作(descrease, wait, acquire)是减小信号量的值。V操作(increase, signal, release)增加信号量的计数值。信号量更像一个资源池,p是从池子中获取资源,v就是将资源返还原创 2021-04-13 20:09:08 · 743 阅读 · 0 评论 -
Go并发编程-内存模型
Go并发编程-内存模型 此处的内存模型并不是指Go对象的内存分配、内存回收、内存整理的规范。指的是在并发环境下goroutine读相同变量的时候,变量的可见性条件。换句话说就是,一个goroutine在读取变量时,在什么条件下,能够看到其他goroutine对这个变量进行赋值的结果。 由于CPU的指令重排序和多级Cache的存在,保证多核条件下,访问同一个变量这件事情变得很复杂。所以编程语言需要一个规范用来明确多线程同时访问一个变量的可见性及顺序。这个规范就叫做内存模型指令重排序导致的问题原创 2021-04-12 19:54:29 · 172 阅读 · 0 评论 -
Go实现的压测工具
Go实现的压测工具 压测是用来确定系统稳定性的一种测试方法,主要检测服务器的承受能力,包括用户承受能力。这样可以对未来可能达到用户数量以及活动时高流量时有一个预估,可以提前准备机器来保证项目稳定运行。压测名词及服务器指标名词QPS:服务器每秒钟处理请求数量 (req/sec 请求数/秒 一段时间内总请求数/请求时间)错误率:在压测中,请求成功的数量与请求失败数量的比率平均响应时间:在一次压测中,从发出请求或指令系统做出的反映(响应)的平均时间cpu的利用率:CUP 利用率分用户态、系统态和原创 2021-02-25 15:30:46 · 1431 阅读 · 0 评论 -
Go并发编程-Once
Go并发编程-Once 只执行一次。常用于单例对象的延迟初始化和并发访问下的只需一次初始化的共享资源或者在测试时候初始化测试资源。简单用 sync.Once 只暴露了一个Do方法,多次调用时只会执行一次func main() { o := sync.Once{} o.Do(GetConn) o.Do(GetConn)}func GetConn() { fmt.Println("获取连接")} 分析以上代码:main方法中调用了两次do方法,但是GetConn只执行了一原创 2021-02-23 18:43:07 · 147 阅读 · 0 评论 -
Go并发编程-WaitGroup
Go并发编程-WaitGroup 协同等待,任务编排利器简单用 WaitGroup解决了并发等待的问题。在使用groutine执行任务时,经常需要等待goroutine全部执行完成后再执行下一步。WaitGroup并发原语非常容易的解决了这个问题。func main() { wg := sync.WaitGroup{} wg.Add(10) for i := 0; i < 10; i++ { go func() { defer wg.Done() fmt.Pri原创 2021-02-20 19:35:17 · 260 阅读 · 0 评论 -
Go并发编程-RWMutex
Go并发编程-RWMutex简单用 读写互斥锁RWMutex与互斥锁Mutex使用方法非常类似。在使用互斥锁Mutex时,并行会变成串行化,降低了效率,分析的时候就会发现读写如果能够分离开能极大的提高效率。也就是将串行读改为并行读,串行写保持不变。这是一个经典的readers-wriders问题。解决readers-writers有三种方案,read-prefer,write-prefer,不指定优先级。Read-prefer:读优先,提高很好的并发性,但是会导致写饥饿问题。Write-原创 2021-02-18 23:07:54 · 512 阅读 · 1 评论 -
Go并发编程-Mutex
Go并发编程-Mutex简单用 互斥锁Mutex提供了两个方法Lock和Unlock:进入临界区之前调用Lock方法,退出临界区的时候调用Unlock方法,当一个goroutine拿到了锁,就会阻塞其他gotoute在调用lock的方法上,直到这个锁被释放,并自己获取到了锁。type Count struct { sync.Mutex Count int}func (c *Count) SyncAdd() { c.Lock() defer c.Unlock() c.Count++原创 2021-02-07 18:19:15 · 380 阅读 · 0 评论