2 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
創(chuàng)建了一個(gè)惡魔,它將所有消息從測(cè)試通道推送到所有其他監(jiān)聽(tīng)程序。
var test = make(chan string)
var mapChan = make(map[int]chan string)
var count = 3
func main() {
go initChan()
go deamon()
for i := 0; i < count; i++ {
mapChan[i] = make(chan string)
go readChan(i)
}
var input string
fmt.Scanln(&input)
}
func deamon() {
for {
message := <-test
for i := 0; i < count; i++ {
mapChan[i] <- message
}
}
}
func initChan() {
for i := 0; i < 100; i++ {
test <- "Iteration num: " + strconv.Itoa(i)
time.Sleep(time.Second * 1)
}
}
func readChan(i int) {
for {
select {
case message := <-mapChan[i]:
log.Println(message)
default:
// Do for not when written on channel
}
}
}

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果我正確理解您的問(wèn)題,此解決方案可能會(huì)有所幫助。我使用了一個(gè)大小為 1 的緩沖通道,因此作為發(fā)送方的 goroutine 永遠(yuǎn)不會(huì)被阻塞,這是在無(wú)緩沖通道的情況下。您可以閱讀有關(guān)頻道的更多信息:頻道的行為
package main
import (
"log"
"strconv"
"sync"
"time"
)
// Buffered channel with size 1 guarantees delayed delivery of data
// As soon as the goroutine sends to the channel, the reciever goroutine dequeus it
// Then the reciver goroutines does the work, but the sender goroutine isn't blocked
// As the size is again 0 after the reciever recieved it but might haven't processed it yet
var test = make(chan string, 1)
func main() {
var wg sync.WaitGroup
wg.Add(2)
// Waits for other goroutines to complete before the main goroutine returns
defer wg.Wait()
go initChan(&wg)
go readChan(&wg)
}
func initChan(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 100; i++ {
// Sends continuously
test <- "Iteration num: " + strconv.Itoa(i)
time.Sleep(time.Second * 5)
}
close(test)
}
func readChan(wg *sync.WaitGroup) {
defer wg.Done()
var message string
var ok bool
// Reciever deques the value as soon as it recieves it
// But might take time to proceed
for {
select {
case message, ok = <-test:
// If channel is closed
if ok == false {
return
}
log.Println(message)
default:
log.Println(message)
}
}
}
- 2 回答
- 0 關(guān)注
- 152 瀏覽
添加回答
舉報(bào)