go goroutine和channel的一個(gè)小demo

寫(xiě)入文件

import (
    "fmt"
    "os"
    "strconv"
    "time"
)
func writeLog(i int, ch chan int) {
    file, err := os.OpenFile("config.txt", os.O_RDWR|os.O_APPEND, 0776)
    defer file.Close()
    if err != nil {
        panic(err)
    }
    file.WriteString("寫(xiě)入文件--" + strconv.Itoa(i) + "\n")
    ch <- i
}
func main() {
    fmt.Println("開(kāi)始------")
    start := time.Now().UnixNano()

    ch := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        go writeLog(i, ch)
    }
    <- ch
    end := time.Now().UnixNano()
    fmt.Println("結(jié)束------", (end-start)/1e6)
}

循環(huán)5次去寫(xiě)入文件。這種寫(xiě)法會(huì)有一個(gè)問(wèn)題洋满,當(dāng)執(zhí)行的時(shí)候剩晴,文件中的內(nèi)容理論上來(lái)講應(yīng)該是

寫(xiě)入文件--5
寫(xiě)入文件--2
寫(xiě)入文件--1
寫(xiě)入文件--4
寫(xiě)入文件--3

但實(shí)際情況是锣咒,每次寫(xiě)的數(shù)量不固定(這可能是因?yàn)橹骶€程執(zhí)行完成,但是開(kāi)啟的goroutine還沒(méi)跑完)
所以赞弥,修改下main毅整,使用range遍歷通道消息

func main() {
    fmt.Println("開(kāi)始------")
    start := time.Now().UnixNano()

    ch := make(chan int)
    for i := 1; i <= 5; i++ {
        go writeLog(i, ch)
    }
    for s := range ch {
        fmt.Println(<-ch)
    }
    end := time.Now().UnixNano()
    fmt.Println("結(jié)束------", (end-start)/1e6)
}

此時(shí),寫(xiě)文件的操作不會(huì)"丟失"了绽左,但是程序會(huì)報(bào)錯(cuò):fatal error: all goroutines are asleep - deadlock!
就是說(shuō)悼嫉,死鎖了!因?yàn)閞ange在通道不關(guān)閉的時(shí)候自己也不會(huì)停止讀取拼窥,但是這個(gè)時(shí)候通道并沒(méi)有內(nèi)容可以給他讀取了戏蔑,所以就會(huì)阻塞當(dāng)前goroutines,其結(jié)果就是死鎖鲁纠。
現(xiàn)在再修改main总棵,使用緩沖通道

func main() {
    fmt.Println("開(kāi)始------")
    start := time.Now().UnixNano()

    ch := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        go writeLog(i, ch)
    }
    for j := 0; j < 5; j++ {
        fmt.Println(<-ch)
    }
    end := time.Now().UnixNano()
    fmt.Println("結(jié)束------", (end-start)/1e6)
}

好了,消停了改含,寫(xiě)入數(shù)量正常了情龄,也不死鎖了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骤视,隨后出現(xiàn)的幾起案子鞍爱,更是在濱河造成了極大的恐慌,老刑警劉巖尚胞,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異帜慢,居然都是意外死亡笼裳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)粱玲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)躬柬,“玉大人,你說(shuō)我怎么就攤上這事抽减≡是啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵卵沉,是天一觀的道長(zhǎng)颠锉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)史汗,這世上最難降的妖魔是什么琼掠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮停撞,結(jié)果婚禮上瓷蛙,老公的妹妹穿的比我還像新娘。我一直安慰自己戈毒,他們只是感情好艰猬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著埋市,像睡著了一般冠桃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上道宅,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天腊满,我揣著相機(jī)與錄音,去河邊找鬼培己。 笑死碳蛋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的省咨。 我是一名探鬼主播肃弟,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了笤受?” 一聲冷哼從身側(cè)響起穷缤,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箩兽,沒(méi)想到半個(gè)月后津肛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汗贫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年身坐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落包。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡部蛇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咐蝇,到底是詐尸還是另有隱情涯鲁,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布有序,位于F島的核電站抹腿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旭寿。R本人自食惡果不足惜幢踏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望许师。 院中可真熱鬧房蝉,春花似錦、人聲如沸微渠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逞盆。三九已至檀蹋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間云芦,已是汗流浹背俯逾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舅逸,地道東北人桌肴。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像琉历,于是被迫代替她去往敵國(guó)和親坠七。 傳聞我的和親對(duì)象是個(gè)殘疾皇子水醋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Chapter 8 Goroutines and Channels Go enable two styles of...
    SongLiang閱讀 1,576評(píng)論 0 3
  • 并發(fā)性Concurrency 1.1 什么是并發(fā) Go是并發(fā)語(yǔ)言,而不是并行語(yǔ)言彪置。在討論如何在Go中進(jìn)行并發(fā)處理之...
    Venture_Mark閱讀 394評(píng)論 0 0
  • 并發(fā)性Concurrency 1.1 什么是并發(fā) Go是并發(fā)語(yǔ)言拄踪,而不是并行語(yǔ)言。在討論如何在Go中進(jìn)行并發(fā)處理之...
    yuyangray閱讀 901評(píng)論 0 2
  • 通道也可以聲明為僅支持單向數(shù)據(jù)流——即你可以定義僅支持發(fā)送或僅支持接收數(shù)據(jù)的通道拳魁。我將在本節(jié)的末尾解釋單向數(shù)據(jù)流的...
    one_zheng閱讀 313評(píng)論 0 0
  • 【帶心旅行】文末學(xué)而思只猜出來(lái)第一首惶桐,因?yàn)樾W(xué)課本里學(xué)的,那時(shí)候就被老師一通講記住蘇東坡愛(ài)吃紅繞肉潘懊,而蘇軾發(fā)明的就...
    楊子城堡閱讀 293評(píng)論 0 0