首頁 >後端開發 >Golang >golang函數與goroutine互動的機制是什麼?

golang函數與goroutine互動的機制是什麼?

WBOY
WBOY原創
2024-05-02 18:36:02958瀏覽

函數與Goroutine 在Go 語言中透過以下機制互動:通道(Channel):在Goroutine 之間安全交換資料管道(Pipe):用於與外部進程通訊

golang函數與goroutine互動的機制是什麼?

Go 語言中函數與Goroutine 互動的機制

Goroutine 簡介

Goroutine 是輕量級線程,允許Go 程式並行執行程式碼。它由 Go Runtime 管理,用於並行處理任務而無需手動建立和管理線程。
  • 函數與Goroutine 的交互作用Go 語言中函數與Goroutine 的交互作用是透過下列機制實現的:
  • 通道(Channel):
  • 一種用於在Goroutine 之間安全地交換資料的通訊機制。它是一個類型化的佇列,發送方將資料寫入通道,而接收方從中讀取資料。

管道 (Pipe):###一種特殊類型的通道,旨在與命令列工具或其他外部程序通訊。 #########實戰案例:並行求和######為了示範函數與Goroutine 交互,我們創建一個簡單的並行求和程序:###
package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

const numIterations = 1000000

func main() {
    sum := 0

    // 初始化互斥锁以保护并发的 sum 变量
    lock := &sync.Mutex{}

    // 创建一个通道
    c := make(chan int)

    // 创建 Goroutine 并发计算和并将结果发送到通道
    for i := 0; i < numIterations; i++ {
        go func(num int) {
            rand.Seed(time.Now().UnixNano())
            time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond)
            lock.Lock()
            defer lock.Unlock()
            sum += num
            c <- num
        }(i)
    }

    // 从通道接收数据并打印进度条
    for i := 0; i < numIterations; i++ {
        <-c
        fmt.Printf("\rProgress: %f%", float64(i)/float64(numIterations)*100)
    }

    // 等待所有 Goroutine 完成
    time.Sleep(time.Second)

    fmt.Println("\nFinal sum:", sum)
}
###在這個程式中,我們使用管道和互斥鎖來實現函數與Goroutine 之間的交互作用:#########互斥鎖保護並發存取的變數###sum###,以確保資料完整性。 ######Goroutine 將求和結果傳送到管道。 ######主函數從管道中讀取結果並列印進度條。 #########透過這種機制,Goroutine 可以並發執行求和任務,而主函數可以追蹤進度並收集最終結果。 ###

以上是golang函數與goroutine互動的機制是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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