Go 利用channel形成管道溝通迴圈內外

2021-09-29 22:58:01 字數 1292 閱讀 8862

這個要解決的問題是,比如如果有乙個大迴圈,取自乙個大的檔案,要進行邏輯處理,那麼這個邏輯的**要放在迴圈每一行的迴圈體裡面,這樣有可能會出現乙個for迴圈的邏輯巢狀,一層又一層,類似俄羅斯套娃.如果放在外面那麼就需要把大迴圈的每一行資料存到乙個陣列或者切片裡面,這樣會佔很大的記憶體

那麼就可以使用這種技巧來既能解決迴圈巢狀,又能解決不存在占用大記憶體的資料

建立乙個channel,開啟乙個goroutine,在groutine裡面進行for迴圈遍歷,把每一行的資料傳送到channel中

在主groutine裡面,讀取channel,因為接收者總是比傳送者先執行,那麼這個地方就會阻塞等待那乙個資料到來

這樣就形成這樣乙個良性的同步操作,雖然是在不同的groutine裡面執行的,但是總是同步執行的,並且解決了迴圈巢狀的問題

package main

import

"fmt

"import

"time

"func main()

yields := make(chan int

) go func()

close(yields)

}()for i :=range yields

}

就是這樣的效果

迴圈內 1

迴圈外:

1迴圈內

2迴圈外:

2迴圈內

3迴圈外:

3迴圈內

4迴圈外:

4迴圈內

5迴圈外:

5迴圈內

6迴圈外:

6

如果那個channel是個有快取的channel,就會先把快取數量的全都塞進channel,後迴圈外才執行,這個在很多的案例裡都有使用

yields := make(chan int, 6

)迴圈內

1迴圈內

2迴圈內

3迴圈內

4迴圈內

5迴圈內

6迴圈外:

1迴圈外:

2迴圈外:

3迴圈外:

4迴圈外:

5迴圈外:

6

比如說這樣的**:

mailboxes := make(chan *imap.mailboxinfo, 20

) go func() ()

//列取郵件夾

for m :=range mailboxes

這個很像是php中的yield的作用,溝通函式內外

利用管道(channel)實現同步

go語言實現同步的方式有很多,互斥量 sync.mutex channel通訊等等 今天總結一下go中的channel方式!channel通訊包含兩種模式 一種是帶無緩衝的channel,另一種是有緩衝的channel 在無快取的channel上的每一次傳送操作都會有對應的接受操作相配對,傳送和接受...

Go語言的管道Channel用法

channel 是有型別的管道,可以用 channel 操作符 ch v 箭頭 就是資料流的方向。和 map 與 slice 一樣,channel 使用前必須建立 ch make chan int 預設情況下,在另一端準備好之前,傳送和接收都會阻塞。這使得 goroutine 可以在沒有明確的鎖或競...

Go併發控制 channel

雖然上次提過的sync控制併發很簡單,但是他有一定的侷限性,他也只能控制能過讓所有的goroutine在程式結束時完成,並不能干涉各個goroutine,下面我們介紹一種更好的方式,就是利用通道 首先先說用channel控制併發在程式結束之前完成 func main ch sum fmt.print...