在Go中,协程的退出通常通过chan
实现。下面是一种常见的模式来实现阻塞的协程退出:
package main
import (
"fmt"
"time"
)
func worker(done chan bool) {
fmt.Println("协程开始执行...")
// 模拟耗时操作
time.Sleep(2 * time.Second)
fmt.Println("协程执行完毕!")
done <- true
}
func main() {
done := make(chan bool)
go worker(done)
// 阻塞等待协程完成
<-done
fmt.Println("主函数退出")
}
在上面的例子中,worker
函数是一个阻塞的协程,它执行一些耗时的操作。在worker
函数执行完毕后,通过将true
发送到done
通道来通知主函数协程的完成。主函数使用<-done
语法从通道中接收数据,从而阻塞等待协程的完成。一旦接收到数据,主函数就会继续执行,打印"主函数退出"。
这种使用chan
来实现协程退出的模式非常常见,因为它提供了一种简单而可靠的方式来同步协程的执行。