Golang併發模式 channel高階使用

2021-09-29 16:37:53 字數 1858 閱讀 8891

再pipeline的情況中,我們通過done來通知goroutine結束。但是,如果我們處理的channel來自系統其它分散的部分,則無法通過done來控制,因為我們不知道資料流終止的時間,此時需要引入or-done機制。or-done機制本質上是對外界資料channel的乙個封裝,以便我們可以實際控制。

給出**示例:

package main

func

main()

)<-

chan

inte***ce)go

func()

select}}

}()return valstream

}}

tee**於linux的tee命令,該模式核心作用是把發來的資料流重新傳送到**中兩個不同的地方。我們傳遞乙個channel,然後返回兩個單獨的channel,用以獲得相同的值。給出**示例:

package main

import

"fmt"

func

main()

, in <-

chan

inte***ce)(

<-

chan

inte***ce

,<-

chan

inte***ce))

out2 :=

make

(chan

inte***ce)go

func()

}}}(

)return out1, out2

}genetor :=

func

(done <-

chan

inte***ce

, n int

)<-

chan

inte***ce)go

func()

}}()

return gench

}done :=

make

(chan

inte***ce

)defer

close

(done)

out1, out2 :=

tee(done,

genetor

(done,10)

)for val1 :=

range out1

}

扇出扇出模式中,輸入不需要有序。而橋接channel正好與這個相反,該模式適用於輸入有序的情況,及多個資料流的輸入需要有序的獲取。我們必須先處理完乙個channel中的資料,然後才能繼續向下處理,此時可以把這個多個輸入的channel,作為集合單獨放到channel中。

給出**示例:

package main

func

main()

, chanstream <-

chan

<-

chan

inte***ce

)<-

chan

inte***ce)go

func()

select

stream = maybestream

case

<-done:

return

}// ordone機制同樣的,防止外界關閉造成channel無法釋放

for val :=

range

ordone

(done, stream)}}

}()return valstream

}}

Golang併發模式基礎

最基本的模式 for 每個condition都有機會被執行一次,內部使用了偽隨機的策略。如果case條件全部阻塞,那麼執行default的條件。golang的goroutine無法被gc,只能等待goroutine自動執行結束。因此,如果某些情況下,如果goroutine阻塞了,則只能等待整個程式結...

golang 閒談併發

對於併發這個概念,我想大家都對它不會陌生,今天就從簡單的火車站賣票問題出發,來談談併發。首先宣告本文的 是golang 因為最近開始用的就是golang 對於其他的語言其實也是相通的,那麼正式開始正題吧,首先我們來看看,賣一張票,總票數就減一,一般來說我們會這麼寫 package main impo...

golang 併發實踐

golang 高併發主要是依靠sync包下的api實現,首先就是waitgroup 先說說waitgroup的用途 它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。waitgroup總共有三個方法 add delta int done wa...