置信大家踏入 Go 言语的世界,一定是被弱小的并发(Concurrency)所吸引,Go 言语用最复杂的关键字go就可以将义务丢到后台处置,但是开发者怎样有效率的控制并发,这是入门 Go 言语必学的技艺,本章会引见几种方式来带大家看法并发,而这三种方式辨别对应到三个不同的名词:WaitGroup,Channel,及 Context。下面用复杂的范例带大家了解。
WaitGroup
先来了解有什么情境需求运用到 WaitGroup,假定您有两台机器需求同时上传最新的代码,两台机器辨别上传完成后,才能执行最后的重启步骤。就像是把一个任务同时拆成好几份同时一同做,可以增加时间,但是最后需求等到全部做完,才能执行下一步,这时分就需求用到 WaitGroup 才能做到。
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
i := 0
wg.Add(3) //task count wait to do
go func() {
defer wg.Done() // finish task1
fmt.Println("goroutine 1 done")
i++
}()
go func() {
defer wg.Done() // finish task2
fmt.Println("goroutine 2 done")
i++
}()
go func() {
defer wg.Done() // finish task3
fmt.Println("goroutine 3 done")
i++
}()
wg.Wait() // wait for tasks to be done
fmt.Println("all goroutine done")
fmt.Println(i)
}
Channel
另外一种实践的案例就是,我们需求自动通知一个 Goroutine 停止中止的举措。换句话说,当 App 启动时,会在后台跑一些监控顺序,而当整个 App 需求中止前,需求发个 Notification 给后台的监控顺序,将其先中止,这时分就需求用到 Channel 来通知。看下下面这个例子:
package main
import (
"fmt"
"time"
)
func main() {
exit := make(chan bool)
go func() {
for {
select {
case <-exit:
fmt.Println("Exit")
return
case <-time.After(2 * time.Second):
fmt.Println("Monitoring")
}
}
}()
time.Sleep(5 * time.Second)
fmt.Println("Notify Exit")
exit <- true //keep main goroutine alive
time.Sleep(5 * time.Second)
}
(责任编辑:admin)