再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...