別のゴルーチンをキャンセルする方法

Go言語では、Contextパッケージを使用して、別のコルーチンを実行の中止させることができます。Contextパッケージは、コルーチン間でコンテキスト情報を渡し、コルーチンの実行をキャンセルするメカニズムを提供します。

以下は、context パッケージを使って goroutine の実行をキャンセルするコードの例です。

package main

import (
	"context"
	"fmt"
	"time"
)

func worker(ctx context.Context) {
	for {
		select {
		default:
			// 执行协程的工作逻辑
			fmt.Println("Working...")
			time.Sleep(1 * time.Second)
		case <-ctx.Done():
			// 收到取消信号,退出协程
			return
		}
	}
}

func main() {
	// 创建一个取消上下文和取消函数
	ctx, cancel := context.WithCancel(context.Background())

	// 启动一个协程执行工作函数
	go worker(ctx)

	// 5秒后取消协程执行
	time.Sleep(5 * time.Second)
	cancel()

	// 等待一段时间,确保协程已经退出
	time.Sleep(2 * time.Second)
	fmt.Println("Done")
}

上述の例では、まずcontext.WithCancel関数を使ってキャンセルコンテキストと対応するキャンセル関数を生成しています。そして、goキーワードでワーカー関数を処理するgoroutineを立ち上げており、この関数は、select文を使って、ワーキングロジックを実行するかキャンセル信号を待つかを判断しています。main関数では、cancel関数を実行してキャンセル信号を送信し、ワーカー関数内のキャンセルロジックをトリガーしています。最後に、time.Sleep関数を使用してしばらく待って、goroutineが終了したことを確認しています。

なお、キャンセルシグナルはあくまでゴルーチンに対して送信されるリクエストであり、キャンセルロジックの処理はゴルーチン側で行う必要がある。ワーカー関数内では、case <-ctx.Done(): によりキャンセルシグナルを受け取ったかの判定を行い、受け取った場合はゴルーチンの実行を終了する。

context パッケージを使用することで、コルーチン実行の制御をより柔軟に行い、コルーチンキャンセルやタイムアウトなどの機能を実現できます。

bannerAds