golang 中 sync包的 WaitGroup】的更多相关文章

golang 中的 sync 包有一个很有用的功能,就是 WaitGroup 先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 goroutine 执行完成. WaitGroup 总共有三个方法:Add(delta int), Done(), Wait().简单的说一下这三个方法的作用. Add:添加或者减少等待 goroutine 的数量 Done:相当于Add(-1) Wait:执行阻塞,直到所有的WaitGroup数量…
golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex     func (m *Mutex) Lock()     func (m *Mutex) Unlock() type RWMutex     func (rw *RWMutex) Lock()     func (rw *RWMutex) RLock()     func (rw *RWMutex) RL…
前面刚讲到goroutine和channel,通过goroutine启动一个协程,通过channel的方式在多个goroutine中传递消息来保证并发安全.今天我们来学习sync包,这个包是Go提供的基础包,提供了锁的支持.但是Go官方给的建议是:不要以共享内存的方式来通信,而是要以通信的手段来共享内存.所以他们是提倡使用channel的方式来实现并发控制. 学过Java的同学对锁的概念肯定不陌生,在Java中提供Sychronized关键字提供独占锁,Lock类提供读写锁.在sync包中实现的…
mutex 的实现思想 mutex 主要有两个 method: Lock() 和 Unlock() Lock() 可以通过一个 CAS 操作来实现 func (m *Mutex) Lock() { for !atomic.CompareAndSwapUint32(&m.locked, 0, 1) { } } func (m *Mutex) Unlock() { atomic.StoreUint32(&m.locked, 0) } Lock() 一直进行 CAS 操作,比较耗 CPU.因此带…
------------------------------------------------------------ 临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免重复创建相同的对象造成 GC 负担过重.其中存放的临时对象随时可能被 GC 回收掉(如果该对象不再被其它变量引用). 从 Pool 中取出对象时,如果 Pool 中没有对象,将返回 nil,但是如果给 Pool.New 字段指定了一个函数的话,Pool 将使用该函…
常量声明: const TimeLayout = "2006-01-02 15:04:05" 这是个奇葩,必须是这个时间点,据说是 go 诞生之日, 记忆方法:6-1-2-3-4-5 1. 获取当前时间戳 func GetCurrentSystemTimestamp() int64 { return time.Now().Unix() } 2. 获取当前 string 时间 func GetCurrentSystemTimeStr() string { return time.Now(…
time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1. 时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z…
摘要 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开仟程的生命周期, 在go语言中,只能通过channel + select来实现,但不够直观,感觉很绕. Context 通常被译作 上下文 ,它是一个比较抽象的概念.在公司技术讨论时也经常会提到 上下文 .一般理解为程序单元的一个运行状态.现场.快照,而翻译中 上下 又很好地诠释了其本质,上下上下则是存在上下层的传递, 上 会把内容传递给 下 .在Go语言中,程序单元也就指的是Goroutine.…
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func asyncTestFunc() { ; i < ; i++ { fmt.Println(i) } wg.Done() } func main() { wg.Add() go asyncTestFunc() wg.Wait() }…
在配置了环境变量$GOPATH后,比如下面这个路径 export GOPATH=/mnt/f/ubuntu/goProject 在这个路径下面会有这几个目录 在src目录下放着我的源码比如: 在同一个目录下,比如websocket,不需要import,就可以互相调用其它文件的函数,但是在go run的时候要把那几个用到的文件都加上 如果在websocket目录下定义了其他包,就要新建目录,里面的go文件定义 packge 目录名 比如main.go my.go server包下的websocke…