goroutine和channel是Go言语异常棒的特征,它们供应了一种异常轻巧易用的并发才能。然则当您的运用历程中有许多goroutine的时刻,如安在主流程中守候一切的goroutine 退出呢?
1 经由过程Channel通报退出信号 (引荐进修:go)
Go的一大设想哲学就是:经由过程Channel同享数据,而不是经由过程同享内存同享数据。主流程能够经由过程channel向任何goroutine发送住手信号,就像下面如许:
func run(done chan int) { for { select { case <-done: fmt.Println("exiting...") done <- 1 break default: } time.Sleep(time.Second * 1) fmt.Println("do something") } } func main() { c := make(chan int) go run(c) fmt.Println("wait") time.Sleep(time.Second * 5) c <- 1 <-c fmt.Println("main exited") }
这类体式格局能够完成文雅地住手goroutine,然则当goroutine迥殊多的时刻,这类体式格局不论在代码雅观上照样管理上都显得愚笨不堪。
2 运用waitgroup
sync包中的Waitgroup构造,是Go言语为我们供应的多个goroutine之间同步的好刀。下面是官方文档对它的形貌:
通常情况下,我们像下面如许运用waitgroup:
建立一个Waitgroup的实例,假定此处我们叫它wg
在每一个goroutine启动的时刻,挪用wg.Add(1),这个操纵能够在goroutine启动之前挪用,也能够在goroutine内里挪用。固然,也能够在建立n个goroutine前挪用wg.Add(n)
当每一个goroutine完成任务后,挪用wg.Done()
在守候一切goroutine的处所挪用wg.Wait(),它在一切执行了wg.Add(1)的goroutine都挪用完wg.Done()前壅塞,当一切goroutine都挪用完wg.Done()以后它会返回。
以上就是golang 怎样完毕一个协程的细致内容,更多请关注ki4网别的相干文章!