Go言語で同時実行タスクのキャンセルをどのように処理するか
Go言語では、コンテキストパッケージを使用することで、並列処理におけるタスクのキャンセル問題に対処できます。
まず、contextパッケージを使ってコンテキストオブジェクトを作成します(例:
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
そのうえで、並行タスクでは、キャンセル信号を監視するためにselect文を使用します。
select {
case <-ctx.Done():
// 任务被取消,执行清理操作
return
default:
// 执行任务操作
// ...
}
タスクをキャンセルする場合は、cancel 関数を呼び出します。例:
cancel()
キャンセル関数が呼び出されると、同じコンテキストオブジェクトを使用しているすべてのコルーチンがキャンセルシグナルを受け取り、タスク処理を停止します。
完全なサンプルコードを以下に示します。
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
go worker(ctx, "worker1")
go worker(ctx, "worker2")
time.Sleep(3 * time.Second)
cancel()
time.Sleep(1 * time.Second)
}
func worker(ctx context.Context, name string) {
for {
select {
case <-ctx.Done():
fmt.Printf("%s: 任务被取消\n", name)
return
default:
fmt.Printf("%s: 执行任务\n", name)
time.Sleep(1 * time.Second)
}
}
}
上記のコードを実行すると、次の結果が出力されます。
worker1: 执行任务
worker2: 执行任务
worker1: 执行任务
worker2: 执行任务
worker1: 任务被取消
worker2: 任务被取消