Go 緩衝通道

2022-04-03 04:23:03 字數 1243 閱讀 3819

語法結構:cap為容量

ch := make(chan type, cap)

通道是非同步的,是一種在被建立時就被開闢了能儲存乙個或者多個值的通道。

這種型別並不要求傳送與接收同時進行。只要緩衝區有未使用空間用於傳送資料,或還包含可以接收的資料,那麼其通訊就會無阻塞地進行。只有在通道中沒有要接收的值時,接收動作才會阻塞。

示例一

package main

import (

"fmt"

)func main()

示例二

package main

import (

"fmt"

"time"

)func write(ch chan int)

close(ch)

}func main()

}

建立乙個兩個容量的通道。

write協程先向通道裡寫入兩個資料,然後阻塞,並列印,主協程睡眠兩秒。

兩秒後,主協程從通道中讀取乙個資料,並睡眠兩秒,此時write協程繼續向通道裡寫入乙個資料,然後阻塞,等待主協程兩秒後讀取資料。

package main

import (

"fmt"

)func main()

當我們向通道寫入資料時,超出了通道的容量,因此寫入發生了阻塞。現在想要寫操作能夠進行下去,必須要有其它協程來讀取這個通道的資料。

但在程式中,並沒有併發協程來讀取這個通道,因此這裡會發生死鎖(deadlock)。

假設我們有 3 個併發執行的 go 協程(由go 主協程生成)。go 主協程需要等待這 3 個協程執行結束後,才會終止。這就可以用 waitgroup 來實現。

package main

import (

"fmt"

"sync"

"time"

)func process(i int, wg *sync.waitgroup)

/* waitgroup用於等待一組執行緒的結束。

父執行緒呼叫add方法來設定應等待的執行緒的數量。

每個被等待的執行緒在結束時應呼叫done方法。

同時,主線程裡可以呼叫wait方法阻塞至所有執行緒結束。

*/func main()

//wait方法阻塞直到waitgroup計數器減為0。

wg.wait()

fmt.println("over")

}

Go無緩衝通道的陷阱

channel是go的特色之一,甚至說是最大的特色也不為過,使用起來也非常簡單。首先定義乙個int型別的channel ch1 make chan int 無緩衝通道 ch2 make chan int,10 帶緩衝的通道我們這裡主要關注無緩衝通道。來看看這段 package main import...

go語言通道插入0 Go語言帶緩衝的通道

go語言中有緩衝的通道 bufferedchannel 是一種在被接收前能儲存乙個或者多個值的通道。這種型別的通道並不強制要求goroutine之間必須同時完成傳送和接收。通道會阻塞傳送和接收動作的條件也會不同。只有在通道中沒有要接收的值時,接收動作才會阻塞。只有在通道沒有可用緩衝區容納被傳送的值時...

Go語言帶緩衝的通道實現

go語言中有緩衝的通道 buffered channel 是一種在被接收前能儲存乙個或者多個值的通道。這種型別的通道並不強制要求 goroutine 之間必須同時完成傳送和接收。通道會阻塞傳送和接收動作的條件也會不同。只有在通道中沒有要接收的值時,接收動作才會阻塞。只有在通道沒有可用緩衝區容納被傳送...