在Go語言中,處理并發編程中的異常需要使用通道(channel)和sync.Mutex
或sync.RWMutex
來確保數據的一致性和同步。這里有一個簡單的示例,展示了如何在Go語言中處理并發編程中的異常:
package main
import (
"errors"
"fmt"
"sync"
)
type Task struct {
ID int
Message string
}
func worker(id int, tasks <-chan Task, results chan<- error, wg *sync.WaitGroup, mu *sync.Mutex) {
defer wg.Done()
for task := range tasks {
mu.Lock()
// 模擬任務執行過程中可能出現的異常
if task.ID == 3 {
mu.Unlock()
results <- errors.New("task 3 encountered an error")
continue
}
mu.Unlock()
// 模擬任務正常執行
fmt.Printf("Worker %d processed task %d\n", id, task.ID)
results <- nil
}
}
func main() {
const numWorkers = 5
const numTasks = 10
tasks := make(chan Task, numTasks)
results := make(chan error, numTasks)
var wg sync.WaitGroup
var mu sync.Mutex
// 啟動工作協程
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go worker(i, tasks, results, &wg, &mu)
}
// 向任務通道發送任務
for i := 1; i <= numTasks; i++ {
tasks <- Task{ID: i}
}
close(tasks)
// 等待所有工作協程完成
wg.Wait()
close(results)
// 處理結果
for err := range results {
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Success")
}
}
}
在這個示例中,我們創建了一個worker
函數,它接收一個任務通道、一個結果通道、一個等待組和一個互斥鎖。工作協程從任務通道中獲取任務,執行任務,并將結果發送到結果通道。如果在執行任務過程中遇到異常(例如任務ID為3),我們將錯誤發送到結果通道,并繼續處理下一個任務。
在main
函數中,我們啟動了5個工作協程,并向任務通道發送了10個任務。然后,我們等待所有工作協程完成,并處理結果通道中的錯誤和成功消息。