golang中使用一個通道向多個goroutine發(fā)送一個數(shù)據(jù)

向一個goroutine通信

向通道發(fā)送一次消息只有一個goroutine能收到數(shù)據(jù)音婶,goroutine向一個通道取數(shù)據(jù)類似于銀行里一個柜臺排隊取錢棒拂,goroutine是那排在長長的隊伍,一個通道(channel)就是一個柜臺写隶,只有等前一個goroutine取完數(shù)據(jù)之后关顷,后一個goroutine才能取下一個數(shù)據(jù)缺菌。

  • 一個goroutine循環(huán)接收

golang中向一個goroutine只需將值傳入通道中蚌斩,然后在goroutine里從這個通道取值即可荆忍,由于只有一個goroutine在循環(huán)接收數(shù)據(jù)匹耕,相當(dāng)于隊伍中只有一個人膜蛔,取完數(shù)據(jù)之后可以繼續(xù)站在柜臺前等待螟深,例如:

package main

import (
"bufio"
"os"
)

func main() {
  ch, scan:= make(chan string),bufio.NewScanner(os.Stdin)

  // goroutine1
  go func() {
    for {
      fmt.Println(<-ch)
      fmt.Println("goroutine1")
    }
  }()

  // 按一次回車向通道發(fā)送一條消息
  for {
  scan.Scan()
  ch <- "Hello goroutine"
  }
}

向通道放入數(shù)據(jù)時確保有g(shù)oroutine正在等待著這個通道的數(shù)據(jù)敬特,若這個通道沒有g(shù)oroutine等待數(shù)據(jù)則會報錯柔吼。

fatal error: all goroutines are asleep - deadlock!

  • 多個goroutine循環(huán)接收數(shù)據(jù)

例如這個代碼例子毒费,每點一次回車向一個通道發(fā)送一次數(shù)據(jù),但是一次只能有一個goroutine收到數(shù)據(jù)愈魏。如果接收完數(shù)據(jù)之后想要再次從這個通道接收數(shù)據(jù)則需要到隊伍的最后重新排隊等待觅玻。

package main

import (
"bufio"
"fmt"
"os"
)

func main() {
  i, ch, scan := 0, make(chan string), bufio.NewScanner(os.Stdin)
  // goroutine1
  go func() {
    for {
    fmt.Print(<-ch)
    fmt.Println("goroutine1")
  }
}()

// goroutine2
go func() {
  for {
    fmt.Print(<-ch)
    fmt.Println("goroutine2")
  }
}()
  
// goroutine3
  go func() {
    for {
      fmt.Print(<-ch)
      fmt.Println("goroutine3")
    }
  }()

  for {
    scan.Scan()
    ch <- fmt.Sprintf("%d : Hello ", i)
    i++
  }
}

多個goroutine同時接收通道的一條消息

原理很簡單,舉個例子:假如柜臺前所有的人都要看一張通知單培漏,柜員A在柜臺前將通知單遞給第一個人時溪厘,安排柜員B排到隊伍的最后;隊伍中的第一個人看完通知單后將通知單遞回柜臺牌柄,然后到隊伍的最后重新排隊(此時排在柜員B的后面)畸悬,接著下一個人重復(fù)第一個人的操作,直到柜員B排到柜臺前拿走通知單珊佣,走回柜臺里(不將通知單給下一個人)蹋宦。這樣第一個看通知單的人重新回到柜臺前等待下一個數(shù)據(jù)。

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
  i, ch, scan := 0, make(chan string), bufio.NewScanner(os.Stdin)
  
  // goroutine1
  go func() {
    for {

      /* 獲取通道里的數(shù)據(jù) */
      m := <-ch
      fmt.Print(m)
      fmt.Println("goroutine1")

      /* 處理完成之后將數(shù)據(jù)通過通道遞給下一個goroutine
      ch <- m
    }
  }()

  // goroutine2
  go func() {
    for {
      
      /* 此處處理同goroutine1 */
      m := <-ch
      fmt.Print(m)
      fmt.Println("goroutine2")
      ch <- m
    }
  }()

// goroutine3
  go func() {
    for {
      m := <-ch
      fmt.Print(m)
      fmt.Println("goroutine3")
      ch <- m
    }
  }()

  for {
    scan.Scan()
    
    /* 按下一次回車向通道發(fā)送一次數(shù)據(jù) */
    ch <- fmt.Sprintf("%d : Hello ", i)
    
    /* 向通道里傳遞數(shù)據(jù)后立即到隊伍后面重新排隊 */ 
    <-ch
    i++
  }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咒锻,一起剝皮案震驚了整個濱河市冷冗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惑艇,老刑警劉巖蒿辙,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滨巴,居然都是意外死亡须板,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門兢卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來习瑰,“玉大人,你說我怎么就攤上這事秽荤√鹧伲” “怎么了柠横?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長课兄。 經(jīng)常有香客問我牍氛,道長,這世上最難降的妖魔是什么烟阐? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任搬俊,我火速辦了婚禮,結(jié)果婚禮上蜒茄,老公的妹妹穿的比我還像新娘唉擂。我一直安慰自己,他們只是感情好檀葛,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布玩祟。 她就那樣靜靜地躺著,像睡著了一般屿聋。 火紅的嫁衣襯著肌膚如雪空扎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天润讥,我揣著相機(jī)與錄音转锈,去河邊找鬼。 笑死楚殿,一個胖子當(dāng)著我的面吹牛黑忱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勒魔,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甫煞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冠绢?” 一聲冷哼從身側(cè)響起抚吠,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弟胀,沒想到半個月后楷力,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡孵户,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年萧朝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夏哭。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡检柬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竖配,到底是詐尸還是另有隱情何址,我是刑警寧澤里逆,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站用爪,受9級特大地震影響原押,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偎血,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一诸衔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颇玷,春花似錦笨农、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽违崇。三九已至阿弃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羞延,已是汗流浹背渣淳。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留伴箩,地道東北人入愧。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像嗤谚,于是被迫代替她去往敵國和親棺蛛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355