Golang中Channel簡介
Go語言中的channel是一種核心的并發控制結構,它允許在不同的goroutine之間同步和傳遞數據。以下是channel的一些基本特性:
channel是一種類型,可以用于在goroutine之間傳遞數據。- 通過
make函數創建channel,例如ch := make(chan string)創建了一個用于傳遞字符串的channel。 channel有三種基本操作:發送、接收和關閉,發送操作使用ch <- x,接收操作使用x := <-ch或<-ch。channel分為有緩沖和無緩沖兩種。無緩沖channel在讀寫過程中都會阻塞,直到發送和接收操作都準備好。有緩沖channel在緩沖區滿時寫操作會阻塞,空時讀操作會阻塞。無緩沖channel是同步的,發送和接收操作必須同時準備好。有緩沖channel是異步的,寫操作在緩沖區未滿時直接返回,讀操作在緩沖區不空時進行。channel可以被關閉,關閉后不能再進行發送操作,但可以繼續進行接收操作直到緩沖區的數據被讀完。channel的容量是make函數中指定的緩沖區大小,長度是當前緩沖區中的數據數量。channel可能會導致循環阻塞或協程泄漏,需要特別注意使用方法以防止死鎖和協程泄漏的產生。
Golang使用Channel實現并發控制
代碼demo
package main
?
import (
"fmt"
"sync"
"time"
)
?
// 定義協程池
type ThreadPool struct {
ch chan int
}
?
// 創建協程池,含最大并發量參數
func NewThreadPool(maxCoroutines int) *ThreadPool {
return &ThreadPool{
ch: make(chan int, maxCoroutines),
}
}
?
// 從協程池獲取協程,以處理任務
func (tp *ThreadPool) Get() {
tp.ch <- 1
}
?
// 任務完成后,歸還協程至協程池
func (tp *ThreadPool) Put() {
<-tp.ch
}
?
func main() {
?
maxCoroutines := 5
tp := NewThreadPool(maxCoroutines)
?
wg := sync.WaitGroup{}
for i := 0; i < 50; i++ {
tp.Get()
wg.Add(1)
go func(i int) {
defer func() {
wg.Done()
tp.Put()
}()
time.Sleep(100 * time.Microsecond)
fmt.Println("idx ", i)
}(i)
}
wg.Wait()
fmt.Println("finish")
}
代碼解讀
- 使用帶緩沖的
channel實現最大并發量的控制。- 通過
NewThreadPool(maxCoroutines int)創建最大并發量為maxCoroutines的協程池。 - 協程池的
Get()方法,向帶緩沖的channel中寫入數據,作用是獲取空閑協程池來處理任務; 若chnanel已滿則阻塞,實現最大并發量控制。 - 協程池的
Put()方法,從帶緩沖的channel中獲取數據,作用是釋放資源池,增加新的可用協程。
- 通過
- 使用
sync.WaitGroup等待所有任務結束。- 任務開始時使用
sync.WaitGroup.Add(1)方法增加任務計數。 - 任務結束時使用
sync.WaitGroup.Done()方法減少任務計數,減少1。 - 最后使用
sync.WaitGroup.Wait()方法等待所有任務完成。
- 任務開始時使用