<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          徹底搞懂channel原理(二)

          共 1526字,需瀏覽 4分鐘

           ·

          2021-11-04 17:29

          上一篇文章主要介紹channel運行時是通過hchan表示的,也簡單說明了hchan各個字段的含義

          我們提到,對channel的操作,本質(zhì)上就是對hchan里字段的操作。因為在操作的過程中使用了互斥鎖,所以保證了channel的并發(fā)安全

          這篇文章主要通過現(xiàn)實生活的一些例子來說明channel的一些原理,當(dāng)然還是不會涉及過多源碼。


          無緩沖

          我們都知道channel分為無緩沖和緩沖。這兩者最大的區(qū)別是什么

          我們用一個現(xiàn)實生活的快遞例子來說明

          上面場景是快遞員在等小庫,當(dāng)然反過來小庫也可能在等快遞員


          如果沒有快遞柜,快遞員在送快遞的過程中,如果家里沒人,他就得在那等著,等著有人來簽收快遞,他才送貨結(jié)束。

          客戶在快遞員到來之前,他也不能離開家,不然快遞來了沒人收,所以他也得等到快遞員上門,簽字收了快遞,他才算收貨結(jié)束


          當(dāng)然,客戶不止有這家快遞,如果快遞員A在等的時候又來一個快遞員B給他送貨。這個快遞員B不僅得等著,還得排隊。等到客戶到家后,肯定是先簽收A的快遞,然后再簽收B的快遞。

          對應(yīng)到無緩沖channel

          發(fā)送數(shù)據(jù)的時候,如果沒有對應(yīng)的接收者ready那么發(fā)送者就進入到等待發(fā)送隊列中,等待有對應(yīng)的接收者喚醒它。

          接收數(shù)據(jù)的時候,如果沒有對應(yīng)的發(fā)送者ready那么接收者就進入到等待接收隊列中,等待有對應(yīng)的發(fā)送者喚醒它。

          還記得上一篇文章我們介紹過hchan的結(jié)構(gòu)嗎


          其中recvq表示等待接收消息的隊列sendq表示等待發(fā)送消息的隊列

          我們來看waitq

          本質(zhì)上waitq就是一個鏈表,更確切的說是一個雙向循環(huán)的鏈表。其中waitq記錄了鏈表的頭尾sudog記錄了當(dāng)前等待者的上一個等待者(prev)和下一個等待者(next)。

          這就好像小庫在簽收完A的快遞后喊,下一個是誰啊?

          A會說:我的下一個是B。

          B會說:是我。我記得我上一個是A,目前我沒有下一個,所以我是最后一個


          緩沖

          看完了無緩沖隊列,我們再來看緩沖隊列。還是用上面的故事

          只要快遞柜有空閑柜子,快遞員就可以直接把快遞放到柜子里,讓客戶自己去柜子拿。如果發(fā)送沒有空閑的柜子,那就只能等,等到別人告訴我有空閑柜子,我再把快遞放到空出來的柜子里。

          對應(yīng)到緩沖channel上面的快遞柜,就是緩沖channel中存儲數(shù)據(jù)的buffer

          對于發(fā)送者來說:只要緩沖區(qū)未滿,發(fā)送者就可以繼續(xù)發(fā)送數(shù)據(jù)存放在緩沖區(qū)。一旦緩沖區(qū)滿了,發(fā)送者就只能進入到等待發(fā)送隊列中,等待有對應(yīng)的接收者喚醒它,然后它再把數(shù)據(jù)放入到剛剛被取走數(shù)據(jù)的位置。


          對于接收者來說:只要緩沖區(qū)不為空,接收者就可以繼續(xù)接收數(shù)據(jù)。一旦緩沖區(qū)空了,那么接收者就只能進入到等待接收隊列中,等待有對應(yīng)的發(fā)送者喚醒它。


          上面還有什么問題嗎?還真有。


          我們?nèi)】爝f的時候,你一定會按照快遞放入到快遞柜的先后順序取快遞嗎?咋么可能。

          但是在channel中,是會保證消息的先進先出(FIFO)關(guān)系的。至于咋么保證的,我們終結(jié)篇解析代碼細(xì)節(jié)的時候再說


          總結(jié)

          這篇文章主要通過一個快遞的例子來介紹channel操作的原理。下一篇我們介channel針對上述處理的細(xì)節(jié)邏輯



          推薦閱讀


          福利

          我為大家整理了一份從入門到進階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進階看什么。關(guān)注公眾號 「polarisxu」,回復(fù)?ebook?獲取;還可以回復(fù)「進群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线观看国产黄片 | 欧美乱伦色 | 精品一区二区三区四区五区六区七区 | 不卡不卡不卡不卡不卡国产精品视频 | 91人妻无码一区二区三区 |