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

WBOY
發布: 2024-05-02 18:36:02
原創
819 人瀏覽過

函數與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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!