golangでゴルーチンを強制終了させる方法は?
Go言語ではContext.Contextを使ってGoroutineを強制終了できます。
context.Contextは、Go言語でコンテキスト情報を伝達するための標準ライブラリです。これは、協調ルーチン(ゴルーチン)のライフサイクルを制御するために使用でき、ゴルーチンをキャンセルすることもできます。
以下は、context.Contextを使用してゴルーチンをキャンセルするコードの例です。
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个空的context
ctx := context.TODO()
// 启动一个协程
go worker(ctx)
// 等待一段时间
time.Sleep(2 * time.Second)
// 取消协程
cancelCtx, cancel := context.WithCancel(ctx)
cancel()
// 等待协程退出
time.Sleep(1 * time.Second)
}
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("worker canceled")
return
default:
// 在这里执行具体的逻辑
fmt.Println("working...")
time.Sleep(500 * time.Millisecond)
}
}
}
上記のコードでは,最初に空のコンテキストが作成され,次に,キャンセルシグナルが受信されたときに終了するコルーチンが開始されています。
main関数では、2秒待機後にcontext.WithCancelを呼び出してキャンセル機能付きのcontextを作成し、cancel関数を呼び出してゴルーチンをキャンセル。最後にゴルーチンが終了するのを待つ。
コードを実行すると、コルーチンがキャンセル信号を受け取ると終了し、「worker canceled」と表示されます。