函數和Goroutine 之間可以透過以下方式通訊:互斥鎖:用於保護共享資源條件變數:用於通知滿足條件的Goroutine通道:資料傳輸緩衝區原子變數:無鎖並發存取變數實戰案例:並行處理任務,透過Goroutine 提升運算密集任務的執行效率,具體包括建立任務、啟動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中文網其他相關文章!