golang併發channel使用sync.WaitGroup保證所有協程結束並處理額外業務
問題描述
假如一個http請求是很多的陣列id,服務端拿到陣列id去執行業務,但是這個業務執行的時間教長,肯定不能迴圈執行,要讓golang的多協程發揮作用,但是我想對某些id返回的結果做特殊處理,必須保證所有的協程都跑完了才能返回結果,我發現將id放進channel然後多個協程去消費思路是正確的,但是要保證所有的協程精確的跑完,用sync.WaitGroup挺合適的,也許還有更好的辦法,但是這是我目前想的思路。
程式碼
package main
import (
"fmt"
"sync"
)
func main() {
var ch chan int = make(chan int,10)
var wg sync.WaitGroup
var balance = [...]int{1,2,3,4,5,6,7,8,9}
j := 0
for m:=0;m< len(balance);m++{
ch <- balance[m]
wg.Add(1)
}
for n:=0;n< len(balance);n++ {
go func() {
s := <- ch
fmt.Println("s ",s)
if s==4||s==7 {
j++
}
defer wg.Done()
}()
}
wg.Wait()
fmt.Println("j ",j)
fmt.Println("執行完畢")
}
每向通道扔進去一個值就wg.Add(1),然後每一個通道的值被消費就 defer wg.Done(),直到為0時,wg.Wait()就不等待了表示所有協程執行結束了。
這樣在最後面就會列印j為2,是正確的結果,當然j++只是一個簡單的業務操作,這裡可以填任意業務邏輯。
相關文章
- Golang —— goroutine(協程)和channel(管道)Golang
- Golang Channel 高併發的初始Golang
- Golang協程併發的流水線模型Golang模型
- Golang非CSP併發模型外的其他並行方法總結Golang模型並行
- golang開發:channel使用Golang
- Golang 併發程式設計(channel實現)Golang程式設計
- Golang併發程式設計——goroutine、channel、syncGolang程式設計
- 「Golang成長之路」併發之Channel下Golang
- 「Golang成長之路」併發之Channel上Golang
- 5. 併發神奇——協程 |《 刻意學習 Golang 》Golang
- Go多協程併發環境下的錯誤處理Go
- 「Golang成長之路」併發之channel篇2Golang
- Golang Sync.WaitGroup 使用及原理GolangAI
- goroutine併發執行多個任務並依次返回結果2——sync.WaitGroupGoAI
- 【Golang】淺談協程併發競爭資源問題Golang
- Golang語言goroutine協程併發安全及鎖機制Golang
- 啟動一個程式並處理程式結束事件 (轉)事件
- Go 併發 -- 協程Go
- Go - 使用 sync.WaitGroup 來實現併發操作GoAI
- 多協程執行後使用channel收集結果--優雅版本
- 多協程執行後使用channel收集結果--初級版本
- Storm保證訊息處理ORM
- gorm是如何保證協程安全的GoORM
- Golang併發程式設計程式通訊channel瞭解及簡單使用Golang程式設計
- python併發4:使用thread處理併發Pythonthread
- 使用socket+gevent實現協程併發
- go併發 - channelGo
- Golang 協程Golang
- 如何用 Golang 的 channel 實現訊息的批次處理Golang
- 如何用 Golang 的 channel 實現訊息的批量處理Golang
- PHP 多工協程處理PHP
- 使用Fan-Out模式併發處理模式
- 十.Go併發程式設計--channel使用Go程式設計
- MySQL 併發處理MySql
- Postgres併發處理
- golang 多協程的同步方法總結Golang
- golang如何結束goroutineGolang
- 一次併發處理過程, 基於 RedisRedis