1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          Golang Daisy-chain分析

          來源:互聯網轉載 時間:2024-01-29 08:19:54

          在學習 go 并發的過程中,意外看到了菊花鏈的代碼,一開始基本上對于整體流程摸不著頭腦,經過查閱資料和自己苦思,最終找到了兩個關鍵點,捋清了整個執行過程

          代碼:

          func TestFunc5(t *testing.T) {/* *  利用信道菊花鏈篩法求某一個整數范圍的素數 *  篩法求素數的基本思想是:把從1開始的、某一范圍內的正整數從小到大順序排列, *  1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然后去掉它的倍數。 *  依次類推,直到篩子為空時結束 */const max = 100  // 找出100以內的所有素數nums := xrange() // 初始化一個整數生成器number := <-nums // 從生成器中抓一個整數(2), 作為初始化整數for number <= max { // number作為篩子,當篩子超過max的時候結束篩選fmt.Println(number)         // 打印素數, 篩子即一個素數nums = filter(nums, number) //篩掉number的倍數number = <-nums // 更新篩子}}func filter(in chan int, number int) chan int {// 輸入一個整數隊列,篩出是number倍數的, 不是number的倍數的放入輸出隊列// in:  輸入隊列out := make(chan int)go func() {for {i := <-in // 從輸入中取一個if i%number != 0 {out <- i // 放入輸出信道}}}()return out}func xrange() chan int { // 從2開始自增的整數生成器var ch chan int = make(chan int)go func() { // 開出一個goroutinefor i := 2; ; i++ {ch <- i // 直到信道索要數據,才把i添加進信道}}()return ch}

          代碼是從網絡上復制,然后放在本地測試文件中進行調試的,自己運行的話可以把 TestFunc 改成 main

          對于菊花鏈的代碼,從邏輯上來說并不復雜:

          • 采用的是埃式篩,將 2-n 的整數按照從小到大的順序排列,以 2 為開始的素數,3/2 不能整除是素數,5/2 且 5/3 不能整除是素數,以此類推,不斷從小到大除以已經得出的素數,都不能整除,意味著它沒有可因式分解的余地,也就是素數;代碼也有改進的空間,即使用歐式篩,去除不必要的篩選(這個我還沒研究,感興趣的可以自己看看);

          對于菊花鏈,對我個人而言,最關鍵的兩個點在于:

          1. filter 中所有的 goroutine 都是一直存在的;
          2. filter 中不斷建立 out,而 out 又通過 return 返回給 nums,nums 再通過 filter 傳參給 in;最終效果也就是每個 goroutine 中都建立了一個新的 channel,而這個 channel 都會依次傳遞給下一個 goroutine,也就是第一個的 out 第二個 in 接收,第二個的第三個接收等等,等到所有的 goroutine 依次執行完后,最后一個 goroutine 才會獲取到真正想要的那個 out,然后返回給 nums;

          下面即是我捋出來的整個執行過程:

          1. 通過 xrange 初始化一個 channel nums,接下來依次接收 從 2 開始不斷自增 1 的整數,將作為被篩選的數;
          2. number 初始化中 nums 中獲取 2;
          3. 開始循環篩選 2-max 中的素數,并首先輸出初始素數 2;
          4. nums = filter(nums, number) 將 xrange channel 和 2 傳遞給 filter;
          5. filter 中創建一個 out channel,生成一個 goroutine;
          6. goroutine 中,i 從 xrange channel 也就是 in 中獲取到 2 的自增一 3;
          7. number1 = 2,3%2 不能整除,素數,放入 out,return out;
          8. nums = out,然后 number = <- nums 更新 number 為 3;
          9. 循環輸出,繼續調用 filter,這時候傳入 nums 也就是 out1 和 number 3;
          10. filter 新建 out2,生成 goroutine2,從 out1(in)中讀取,沒有數值,堵塞;
          11. goroutine1 out1 值被消費,繼續運行,從 xrange(in)中讀取 4,number1 = 2,4%2 整除 pass,5%2 不能整除,輸出到 out1,阻塞;
          12. goroutine2 從 out1(in)中順利讀取到值 5,繼續運行,number2 = 3,5%3 不能整除,素數,輸出到 out2,return;
          13. ………………
          14. 依次類推,從 goroutine1 開始,不斷固定的篩掉 2 的倍數、3 的倍數等等,新的 in 不斷阻塞從頭篩選獲取;在這個過程中,out 本身形成了一個鏈條,goroutine 的排序運行讓整個鏈條順利運行;
          15. 最終不斷從 xrange 中獲取到超于一百的素數,return 之后判定結束運行。
          值得注意的是:in2 獲取了 out1,讓 out1 不再阻塞,能夠繼續運行,但是最終還是會阻塞在輸出處 out1,直到最新的 out return,并再次調用 filter。也就是說它們的執行順序并不一直是我上面說的每次都按照順序執行,只是最終呈現的結果是順序的,并且邏輯上沒有問題

          兩個關鍵點卡住了我很長時間,第一點很基礎但一時忽略了,而第二點尤為重要,讓我對整個執行過程總是隔著一層霧。還是需要更多的學習與實踐,記錄下分析結果,與君共勉。

          標簽:菊花鏈邏輯-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          如何刪除pe啟動項?具體的步驟追加1再點開始菜單,中,選擇運行,也可以用“winiconunlockR”快捷鍵就直接進入運行窗口,在窗口中鍵入“msconfig”命令,回車不能執行。2在彈出的“系統配置”窗口中,直接切換到“阻止”選項卡,選擇要刪除掉的啟動項,點擊下面的徹底刪除命令。如何刪除開始菜單中的設定程序訪問和默認值?你想問什么需要補充一下,我可以回答你!我明白了了。是這樣的找。你到控制面板...

          安家電視劇演員表?羅進,孫立。王自健、田雷、孫嘉麗、楊浩宇、張、克里斯蒂娜、郭濤、席美娟、韓童生、李宗翰、丁嘉麗、白志迪、胡可、郝平、王以哲、梁超、戴樂樂。圖靈、楊坤、丁勇岱、董可飛、王志強、康群志、陳牧陽、遲鵬、王景碩、吳玉芳、閻學晶、劉濤、孫燕、錢杰、孫亮、張雯、劉杰、趙震、魏青、郭家明、馬亮等。安家電視劇演員表?《安家》是一部由安建執導的都市劇,由孫儷、羅晉、孫嘉瑜、張、和王以哲主演。該劇講...

          石家莊新百廣場是什么區?是橋西區。石家莊新百廣場在橋西區。地址:河北省石家莊市中山西路139號(近中華街)。穿過新百廣場(東)(西三室內繪畫館)的線路:1號、1號、6號、11號、30號、34號、61號、68號、108號、118號、317號、326號、368號..途經新百廣場(西)的線路:1路、快車1路、游客1路、游客5路、6路、11路、30路、34路、61路、93路、快車107路、192路、317...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>