首頁  >  文章  >  後端開發  >  golang函數與goroutine的通訊方式

golang函數與goroutine的通訊方式

PHPz
PHPz原創
2024-04-26 09:36:02949瀏覽

函數和Goroutine 之間可以透過以下方式通訊:互斥鎖:用於保護共享資源條件變數:用於通知滿足條件的Goroutine通道:資料傳輸緩衝區原子變數:無鎖並發存取變數實戰案例:並行處理任務,透過Goroutine 提升運算密集任務的執行效率,具體包括建立任務、啟動Goroutine 處理任務、收集處理結果三個步驟。

golang函數與goroutine的通訊方式

Go 語言中函數和Goroutine 之間的通訊方式

在Go 語言中,函數和Goroutine 可以透過以下幾種方式進行通訊:

1. 互斥鎖(Mutex)

#互斥鎖定用於保護共享資源,確保同一時間只有一個Goroutine 能夠存取該資源。

var mu sync.Mutex // 全局互斥锁

func increment(i *int) {
    mu.Lock()
    *i++
    mu.Unlock()
}

2. 條件變數(Cond)

條件變數用於在指定條件滿足時通知等待的 Goroutine。

var cond sync.Cond // 全局条件变量

func wait(c *sync.Cond, i *int) {
    c.L.Lock()
    for {
        if *i == 0 {
            c.Wait()
        }
        break
    }
    c.L.Unlock()
}

3. 通道(Channel)

通道是用來在 Goroutine 之間傳送資料的緩衝區。

var ch = make(chan int, 10) // 创建容量为 10 的通道

func send(c chan int, i int) {
    c <- i // 发送数据
}

func receive(c chan int) {
    v := <-c // 接收数据
}

4. 原子變數

原子變數可以在沒有鎖定的情況下進行並發存取。

var atomicInt int64

func incrementAtomic(i *int64) {
    atomicInt++
}

實戰案例:並行處理任務

下面是一個使用Goroutine 並行處理任務的實戰案例:

// 任务类型
type Task struct {
    Num  int
    Chan chan int
}

func processTask(t *Task) {
    // 处理任务并返回结果
    result := t.Num * t.Num
    t.Chan <- result
}

func createTasks(n int) []*Task {
    // 创建 n 个任务
    tasks := make([]*Task, n)
    for i := 0; i < n; i++ {
        tasks[i] = &Task{
            Num:  i,
            Chan: make(chan int),
        }
    }
    return tasks
}

func main() {
    n := 10
    tasks := createTasks(n)

    // 启动 n 个 Goroutine 并行处理任务
    for _, t := range tasks {
        go processTask(t)
    }

    // 从任务中收集处理结果
    results := make([]int, n)
    for i := 0; i < n; i++ {
        results[i] = <-tasks[i].Chan
    }

    // 打印结果
    for _, r := range results {
        fmt.Println(r)
    }
}

使用Goroutine 並行處理任務可以顯著提高程式的執行效率,特別是對於運算密集型任務。

以上是golang函數與goroutine的通訊方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn