在Go語言中處理并發任務取消問題,可以使用context包來管理和取消任務。
首先,使用context包創建一個上下文對象,例如:
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
然后,在并發的任務中通過select語句來監聽取消信號,例如:
select {
case <-ctx.Done():
// 任務被取消,執行清理操作
return
default:
// 執行任務操作
// ...
}
如果要取消任務,可以調用cancel函數,例如:
cancel()
當調用cancel函數時,所有使用同一個context對象的協程都會收到取消信號,從而停止執行任務。
完整的示例代碼如下:
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: 任務被取消