<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] **需求引入** 需求:現在要計算1-200的各個數的階乘,并且把各個數的階乘放入到map中。最 后顯示出來。要求使用goroutine完成 <br> **分析思路:** 1)使用goroutine 來完成,效率高,但是會出現**并發/并行安全問題.** 2)這里就提出了不同goroutine如何通信的問題 <br> **代碼實現:** 1)使用goroutine來完 成(看看使用gorotine并發完成會出現什么問題?然后我們會去解決) 2)在運行某個程序時,如何知道是否存在資源競爭問題。方法很簡單, 在編譯該程序時,增加一個參數**race**即可[**示意圖**] 如下代碼是錯誤的 <br> ![](https://img.kancloud.cn/dc/64/dc6458abaf894a41371c9d2bbcc64ba2_1209x845.png) 圖上代碼運行引發錯誤如圖(報錯太多,只粘貼了重要內容) ![](https://img.kancloud.cn/bb/b0/bbb0dfdd33b80de671ee661acff3e29b_1209x229.png) 上面的代碼示意圖如下 ![](https://img.kancloud.cn/2e/4c/2e4c57c300d8e27350815311b55979f3_1280x349.png) <br> <br> **以上程序問題解決方法如下:** **第一種方法:使用全局變量鎖改進程序** 示例圖如下: ![](https://img.kancloud.cn/f4/fc/f4fce1462d2be4a088082195a04eb6f1_1280x641.png) <br> <br> **sync**包提供了基本的同步基元,如互斥鎖。除了Once和WaitGroup類型,大部分都是**適用于低水平程序線程**,**高水平的同步使用channel通信更好一些。** 本包的類型的值不應被拷貝 ![](https://img.kancloud.cn/4f/d3/4fd3a7b3c1bdfb39c26fe7db488a6ff9_1655x819.png) <br> <br> **代碼如下:** ![](https://img.kancloud.cn/15/0a/150a0a341a8be49a935cc1de86c15a5c_1209x994.png) <br> **結果如下** <br> ![](https://img.kancloud.cn/df/be/dfbed25d333be4f212f534d6e706ffdd_1209x4439.png) <br> <br> **第二種解決方法:channel** 為什么使用channel? 1)前面使用全局變量加鎖同步來解決goroutine的通訊,但不完美 2)主線程在等待所有goroutine 全部完成的時間很難確定,我們這里設置10秒,僅僅是估算。 3)如果主線程休眠時間長了,會加長等待時間,如果等待時間短了,可能還有goroutine 處于工作狀態,這時也會隨主線程的退出而銷毀 4)通過全局變量加鎖同步來實現通訊,也并不利用多個協程對全局變量的讀寫操作。 5)上面種種分析都在呼喚一個新的通訊機制\-channel ### **1.2:channel的介紹** 1)線程通信在每個編程語言中都是重難點,在Golang中提供了語言級別的goroutine之間通信:channel 2)channel不同的翻譯資料叫法不一樣,常見的幾種叫法【**channel是引用類型**】 :-: **管道** :-: **信道** :-: **通道** 3)channel是進程內通信方式,每個channel只能傳遞一個類型的值.這個類型需要在聲明channel時指定 4)channel在Golang中主要的兩個作用 :-: **同步** :-: **通信** 5)Go語言中channel的關鍵字是chan 6)通道類型是Go自帶的,相當于是一個**先進先出的隊列**,同時唯一一個可以滿足并發安全性的類型。聲明一個通道類型變量的時候,首先需要確定通道類型的元素類型,然后還要確定通道的容量,當然**默認容量是0。** 7)channle 本質就是一個數據結構\-隊列 \[示意圖\] 8)數據是先進先出\[FIFO : first in first out\] 9)線程安全,多goroutine訪問時,不需要加鎖,就是說channel本身就是線程安全的 10)channel 有類型的,一個string的channel只能存放sting類型數據。 11)示意圖: ![](https://img.kancloud.cn/e5/f4/e5f45baf4c483e1bcbfbd3e59c360231_1280x475.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看