并發(fā)實(shí)踐中的思考

為什么要寫(xiě)這篇博客

最近在學(xué)習(xí)Go并發(fā)的時(shí)候筏餐,想寫(xiě)一個(gè)并發(fā)的求斐波那契數(shù)的程序意鲸。期間遇到了一些坑抓于,所以來(lái)記錄一下自己的想法。

寫(xiě)并發(fā)程序中遇到的坑

并發(fā)1.0

使用最原始的方式羊异,每次遞歸的時(shí)候事秀,開(kāi)一個(gè)協(xié)程去跑彤断,將結(jié)果放入channel中。最終發(fā)現(xiàn)在求的數(shù)比較大的時(shí)候易迹,并發(fā)比單線程還要慢宰衙。

并發(fā)2.0

于是我考慮應(yīng)該是開(kāi)的協(xié)程太多了,使用協(xié)程池來(lái)控制協(xié)程數(shù)量睹欲。代碼如下:

func mutiExample(pool *tunny.Pool, ch chan int64, n int64) {
    var ans int64
    switch n {
    case 0:
        ans = 0
    case 1, 2:
        ans = 1
    default:
        res := make(chan int64, 2)

        a := func() {
            fmt.Println("start ", n-1)
            mutiExample(pool, res, n-1)
        }
        b := func() {
            fmt.Println("end ", n-2)
            mutiExample(pool, res, n-2)
        }
        go pool.Process(a)
        go pool.Process(b)
        ans = <-res + <-res
    }
    ch <- ans
}

func main() {
    start := time.Now()
    pool2 := tunny.NewCallback(3)
    ch := make(chan int64, 1)
    mutiExample(pool2, ch, 5)
    fmt.Println(<-ch, time.Since(start))
}

發(fā)現(xiàn)的問(wèn)題

現(xiàn)象

  • 如果求的值為5供炼,協(xié)程數(shù)量為3,一定概率會(huì)死鎖窘疮;
  • 如果求的值為5袋哼,協(xié)程數(shù)量為4,則不會(huì)死鎖闸衫;

分析

我們來(lái)通過(guò)一組結(jié)果分析它的執(zhí)行過(guò)程

start  4
end  3
end  1
end  2
start  3
  • 顯然涛贯,程序先開(kāi)了兩個(gè)協(xié)程去跑 n=4 和 n=3 的情況,由于未獲取全部返回蔚出,協(xié)程會(huì)一直阻塞;
  • 然后是 n=2 或 n=1 的情況弟翘,將結(jié)果寫(xiě)入channel,并結(jié)束身冬;
  • 最后執(zhí)行 n=3 的情況衅胀,由于3個(gè)協(xié)程全部被占用岔乔,且它們所期望的值無(wú)法返回酥筝,會(huì)造成死鎖。


    流程.png

結(jié)論

如果要讓程序不出現(xiàn)死鎖雏门,則需要限定協(xié)程池大小大于執(zhí)行 n>2 的協(xié)程的總數(shù)量嘿歌。
因?yàn)檫@種情況下程序無(wú)法直接返回,在等待接收數(shù)據(jù)茁影。

自己的一些思考

  • 在當(dāng)時(shí)遇到這個(gè)問(wèn)題的時(shí)候宙帝,自己一直在想是不是自己程序出了問(wèn)題,而沒(méi)有對(duì)程序的執(zhí)行流程進(jìn)行分析募闲。所以也是給自己提了個(gè)醒步脓,在寫(xiě)程序的時(shí)候,要提前能想清楚程序的執(zhí)行流程浩螺,不要盲目的依賴程序的運(yùn)行結(jié)果靴患。
  • 你會(huì)發(fā)現(xiàn)2.0程序的執(zhí)行效率還是很低,可以發(fā)現(xiàn)這種遞歸程序要出,盲目的去開(kāi)協(xié)程鸳君,是不會(huì)對(duì)效率有提升的。因?yàn)楫?dāng)遞歸層數(shù)很多時(shí)患蹂,協(xié)程池在調(diào)度協(xié)程等問(wèn)題上會(huì)花費(fèi)很多的時(shí)間或颊。
  • 貼出代碼的原因是因?yàn)樽约旱木幋a規(guī)范實(shí)在太差砸紊,比如:命名,取channel的值等囱挑。

總結(jié)

  • 寫(xiě)并發(fā)程序時(shí)醉顽,首先要選取好合適的并發(fā)方案,不能為了并發(fā)而并發(fā)平挑;
  • 并發(fā)程序不能太相信結(jié)果(協(xié)程執(zhí)行順序不確定)徽鼎,而是要想清楚代碼執(zhí)行的流程(道理)
  • 要加強(qiáng)自己對(duì)代碼規(guī)范的要求
  • 要善用測(cè)試,這個(gè)以后再補(bǔ)充吧弹惦。否淤。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棠隐,隨后出現(xiàn)的幾起案子石抡,更是在濱河造成了極大的恐慌,老刑警劉巖助泽,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啰扛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嗡贺,警方通過(guò)查閱死者的電腦和手機(jī)隐解,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诫睬,“玉大人煞茫,你說(shuō)我怎么就攤上這事∩惴玻” “怎么了续徽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亲澡。 經(jīng)常有香客問(wèn)我钦扭,道長(zhǎng),這世上最難降的妖魔是什么床绪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任客情,我火速辦了婚禮,結(jié)果婚禮上癞己,老公的妹妹穿的比我還像新娘膀斋。我一直安慰自己,他們只是感情好末秃,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布概页。 她就那樣靜靜地躺著,像睡著了一般练慕。 火紅的嫁衣襯著肌膚如雪惰匙。 梳的紋絲不亂的頭發(fā)上技掏,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音项鬼,去河邊找鬼哑梳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绘盟,可吹牛的內(nèi)容都是我干的鸠真。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼龄毡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吠卷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沦零,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祭隔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后路操,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疾渴,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年屯仗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搞坝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡魁袜,死狀恐怖桩撮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慌核,我是刑警寧澤距境,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布申尼,位于F島的核電站垮卓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏师幕。R本人自食惡果不足惜粟按,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霹粥。 院中可真熱鬧灭将,春花似錦、人聲如沸后控。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浩淘。三九已至捌朴,卻和暖如春吴攒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂蔽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工洼怔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人左驾。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓镣隶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親诡右。 傳聞我的和親對(duì)象是個(gè)殘疾皇子安岂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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

  • 作者:夢(mèng)海揚(yáng)帆 文章編號(hào):0216 ——參加學(xué)校“一齊三比”課堂教學(xué)比賽活動(dòng)的感悟 【內(nèi)容摘要】課堂是教師的自由...
    夢(mèng)海揚(yáng)帆閱讀 598評(píng)論 0 1
  • 結(jié)構(gòu)化思考:就是理科思考的意思帆吻。增強(qiáng)說(shuō)服力和表現(xiàn)力
    藏_6ac3閱讀 32評(píng)論 0 1
  • 《心靈的本質(zhì)》第八章夢(mèng)嗜闻,創(chuàng)造力,可代拉 在一個(gè)二十分鐘的夢(mèng)里桅锄,你可以經(jīng)驗(yàn)通常要用上幾年的事情琉雳。身體在時(shí)間里老了二十...
    發(fā)現(xiàn)自己_Thomas閱讀 360評(píng)論 0 0