Golang --- 如何在多個goroutine中 關閉特定一個
Written on October 15th, 2017 by Richard Lin最近在上班遇到一個問題,有多個goroutine會同時運行。
每個goroutine的作用為定時更新某個物件。
可是有些物件會停止更新,要找個方法讓goroutine也停止運作,不然大量的goroutine會占用大量資源。
1. StackOverflow的方法
大部份的人都建議使用channel
package main
import "sync"
func main() {
var wg sync.WaitGroup
wg.Add(1)
ch := make(chan int)
go func() {
for {
foo, ok := <- ch
if !ok {
println("done")
wg.Done()
return
}
println(foo)
}
}()
ch <- 1
ch <- 2
ch <- 3
close(ch)
wg.Wait()
}
問題
太多channel
不好管理
2. 簡單Map法
使用map管理是否要繼續使用goroutine
var m map[struct]bool
使用struct當作key
t T{"something"}
go update(t)
func update(t T){
for{
if m[t]{//若沒有m[t] 預設會是false
//刪除map中的t
Delete(m,t)
//關閉goroutine
return
}
dosomething()
}
}
使用方法
當我們要關閉時,我們只要把map[t]設成true。
等下次更新時goroutine就會自動關閉且把map[t]刪除。