91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

Go語言并發編程如何處理異常

小樊
82
2024-11-08 13:47:16
欄目: 編程語言

在Go語言中,處理并發編程中的異常需要使用通道(channel)和sync.Mutexsync.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個任務。然后,我們等待所有工作協程完成,并處理結果通道中的錯誤和成功消息。

0
津市市| 维西| 黄平县| 涞水县| 丰都县| 桂东县| 木兰县| 上思县| 东宁县| 广水市| 卓尼县| 阿拉善左旗| 竹溪县| 桐梓县| 瑞丽市| 巴中市| 什邡市| 蓬溪县| 吉首市| 丹江口市| 南平市| 肥西县| 郁南县| 利津县| 桃源县| 黔东| 芒康县| 姜堰市| 容城县| 那曲县| 徐汇区| 亚东县| 敦化市| 沙雅县| 友谊县| 蓬莱市| 建水县| 鄯善县| 正镶白旗| 竹溪县| 防城港市|