go 如何关闭一个协程 举例 go qidong()
时间: 2023-12-06 22:04:28 浏览: 165
如何终止当前进程
在 Golang 中,如果你想关闭一个协程,可以使用 Go 语言提供的 `context` 包。你可以创建一个 `context` 对象,并在需要关闭协程的时候调用该对象的 `cancel()` 方法。
下面是一个示例代码,其中启动一个协程并在 2 秒后关闭该协程:
```go
package main
import (
"context"
"fmt"
"time"
)
func qidong(ctx context.Context) {
for {
select {
default:
fmt.Println("执行协程中...")
case <-ctx.Done():
fmt.Println(ctx.Err())
return
}
}
}
func main() {
// 创建一个 context 对象,并设置 2 秒后自动超时
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
// 启动协程
go qidong(ctx)
// 等待 3 秒,观察协程是否被正常关闭
time.Sleep(3 * time.Second)
fmt.Println("main 函数退出")
}
```
在上面的示例代码中,我们使用 `context.WithTimeout()` 方法创建了一个自动超时的 context 对象,然后在启动协程的时候把这个 context 对象传递给协程函数 `qidong()`。在协程函数中,我们使用 `select` 语句监听 context 对象的 `Done()` 方法,一旦 context 被关闭,就会从 `Done()` 方法中接收到一个消息,此时我们就可以退出协程函数了。
在 `main()` 函数中,我们等待了 3 秒钟,观察协程是否被正常关闭。在协程函数中,当 context 超时或被取消时,我们会从 `Done()` 方法中接收到一个错误信息,我们可以在这里添加一些清理代码,以确保协程被正常关闭。
阅读全文