精品国产亚洲一区二区三区|亚洲国产精彩中文乱码AV|久久久久亚洲AV综合波多野结衣|漂亮少妇各种调教玩弄在线

<blockquote id="ixlwe"><option id="ixlwe"></option></blockquote>
  • <span id="ixlwe"></span>

  • <abbr id="ixlwe"></abbr>

    可視化學(xué)習(xí)Go并發(fā)編程

    大數(shù)據(jù)

    Go 天生是為并發(fā)而生的東西。簡單來說,我覺得并發(fā)可以看作一種程序的構(gòu)造方式,如下圖所示。

    大數(shù)據(jù)

    并行&并發(fā)

    想了解并行和并發(fā)的區(qū)別,推薦看一下Rob Pike的分享(點擊閱讀原文即可跳轉(zhuǎn))。在這個視頻里,他用形象的Gopher動圖,講解了Go并發(fā)的過程。
    總結(jié)他的觀點如下:

    并發(fā)很強大

    并發(fā)幫助實現(xiàn)并行,使并行(擴展等)變得容易并發(fā)不是并行,并發(fā)重點是架構(gòu),并行重點是執(zhí)行,兩者不同,但相關(guān)。

    因為今天的重點不是講理論,而是站在可視化的角度來展示并發(fā)的過程。所以,結(jié)合這兩個可視化圖形可以直觀的了解并發(fā)和并行的區(qū)別,畢竟一圖勝千言。(請復(fù)制鏈接在瀏覽器中打開)

    并發(fā):http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong36.html并行:http://talks.bingohuang.com/2017/go-concurrency-visualize/parallelism.html

    總的來說,并行就是同時執(zhí)行(通常是相關(guān)的)計算任務(wù)的編程技術(shù),兩個或者多個事件在同一時刻發(fā)生;而并發(fā)是將相互獨立的執(zhí)行過程綜合到一起的編程技術(shù),兩個或多個事件在同一時間間隔內(nèi)發(fā)生。

    為什么要關(guān)注并發(fā)?

    當今是多核的時代,并發(fā)的世界。摩爾定律逐漸失效,需要更多關(guān)注并發(fā)的編程思想。

    大數(shù)據(jù)

    但并發(fā)編程并不容易,而?Go 對并發(fā)有很好的支持。

    Go 語言中的并發(fā)

    Goroutine?– 并發(fā)執(zhí)行

    類似于 UNIX 中的 &很像線程,但更輕量一個 goroutine 就是一個獨立運行的函數(shù)當一個 goroutine 阻塞時,所在的線程會阻塞,但其它 goroutine 不受影響

    通過關(guān)鍵字 go 來創(chuàng)建 goroutine,如下說是

    大數(shù)據(jù)

    Channel

    類似于 UNIX 中的管道它允許在 Goroutine 之間傳遞消息

    如下有一個簡單的例子,這是常見的計時器,后續(xù)還可以做成可視化的圖形。

    大數(shù)據(jù)

    Select

    類似于語言中常見的 switch但它的判斷條件是基于通信,而不是基于值的等量匹配

    大數(shù)據(jù)

    Go讓并發(fā)編程變得簡單起來

    但問題來了:

    我們怎樣去講解 Go 的并發(fā)?我們怎樣思考 Go 的并發(fā)過程?最終,我們怎樣更好的實踐 Go 并發(fā)編程?

    這里祭出一個法寶——GoTrace,它是一個能將 Go 并發(fā)過程可視化的開源工具,出自?divan?大神。主要包含兩個程序:

    gotrace(go):分析?go tool trace?的執(zhí)行結(jié)果gothree(js):?基于?ThreeJs?和?WebGL?生成?3D?圖像

    感謝 divan 大神 提供了這款工具和不少 Go 并發(fā)模式的素材。

    耳聽為虛,眼見為實

    1.Hello,World!

    大數(shù)據(jù)

    無論寫什么語言,都會從 hello world開始,代碼非常簡單 – 單 channel,單 goroutine,一次寫,一次讀。

    效果如下圖(復(fù)制鏈接?http://talks.bingohuang.com/2017/go-concurrency-visualize/helloworld.html?在瀏覽器中打開也可直接訪問):

    大數(shù)據(jù)

    這里藍色的線表示 goroutine 隨著時間運行。細的藍線連接了 ‘main’ 和 ‘#20’,標志著 goroutine 的啟動和停止,揭示了它們的父子關(guān)系。最后,紅色箭頭給我們展示了‘發(fā)送/接受’的動作。實際上它是兩個獨立的動作,我試著用動畫展示成一個單獨的事務(wù):從 A 發(fā)送到 B。 Goroutine 名稱中的的 “#20”,是實際的 goroutine 內(nèi)部 ID,通過某種手段從運行時獲取。

    2.計時器

    記得在前面講Channel舉的一個計時器的例子,也非常典型 – 創(chuàng)建一個 channel,啟動一個 goroutine,在給定的時間間隔之后向這個 channle 寫入數(shù)據(jù),之后將這個 channel 返回給函數(shù)的調(diào)用著。這個調(diào)用者會阻塞固定的時間后去讀取該 channel。讓我們來運行 24 個這樣的計時器并試著做可視化。

    大數(shù)據(jù)

    看一下效果(復(fù)制鏈接http://talks.bingohuang.com/2017/go-concurrency-visualize/timer.html):

    大數(shù)據(jù)

    非常的形象,是不是?

    3.兵乓球

    兩個玩家

    大數(shù)據(jù)
    看一下效果(復(fù)制鏈接?http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong2.html?到瀏覽器中打開)

    大數(shù)據(jù)

    建議在PC端瀏覽器上打開上面的鏈接,可以和 WebGL 動畫交互,玩玩看。你可以放慢、加快,從不同的角度觀察它。

    三個玩家

    上面是常見的2個乒乓球運動員對打的過程,如果是三個運動員會是什么樣呢?現(xiàn)在,讓我們來運行 3 個運動員的試試看。代碼中只要做少量的修改,添加一個 player 即可:

    大數(shù)據(jù)

    效果如下:(復(fù)制鏈接?http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong3.html?到瀏覽器中打開)

    大數(shù)據(jù)

    36個玩家

    讓我們看一個更復(fù)雜的例子,跑36個運動員看看。

    大數(shù)據(jù)

    效果(復(fù)制鏈接http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong36.html?在瀏覽器中打開)

    大數(shù)據(jù)

    在這里我們看到每個運動員都是輪流依次進行,你可能會想為什么是這樣?為什么接球的 goroutine 會依照這么嚴格的順序?

    答案是因為 Go 運行時給接受者(準備從特定的 channel 接收消息的 goroutines)保持一個先進先出(FIFO)的隊列,同時在我們的例子中,每一個運動員正好在他將球打到桌子上的時候就做好準備。

    4.素數(shù)篩

    上面幾個例子比較簡單,讓我們來看一個更復(fù)雜的并發(fā)算法:素數(shù)篩算法,又叫埃拉托斯特尼算法,是一種古老的算法,用于找到小于或等于給定整數(shù)n的素數(shù)。算法核心思想:先用最小的素數(shù)2去篩,把2的倍數(shù)剔除掉;下一個未篩除的數(shù)就是素數(shù)(這里是3)。再用這個素數(shù)3去篩,篩除掉3的倍數(shù)… 這樣不斷重復(fù)下去,直到篩完為止。

    大數(shù)據(jù)

    這個算法的并發(fā)變化是用 goroutines 來過濾數(shù)字 —— 一個 goroutine 發(fā)現(xiàn)一個素數(shù),而 channels 用來把數(shù)字從 generator 傳遞到 filter。當一個素數(shù)被找到了,就會通過 channel 傳遞給 main,再輸出。

    當然,這個算法并不會非常高效,特別是在你想找大量的素數(shù),并且尋找最低的大 O 復(fù)雜度時,但這個算法確非常的優(yōu)雅。

    大數(shù)據(jù)

    大數(shù)據(jù)

    大家可以看一下可視化的樣子(http://talks.bingohuang.com/2017/go-concurrency-visualize/primesieve.html)

    大數(shù)據(jù)

    可以在交互模式中體驗一下該動畫。它的圖形化方式確實能更好的幫助我們理解算法。該 generate 函數(shù) goroutine 從 2 開始發(fā)出每一個整數(shù)。而每一個新的 filter 函數(shù) goroutine 會過濾特定素數(shù)的倍數(shù) – 2,3,5,7……每一個 filter 的第一個數(shù)就是素數(shù),將它發(fā)送給 main 函數(shù),并輸出。如果你旋轉(zhuǎn)圖像自頂向下看的話,你會發(fā)現(xiàn),所有從 goroutine 發(fā)送給 main 的數(shù)字就是素數(shù)。
    非常漂亮的算法,特別是在 3D 圖像下。

    5.其他-Goroutines? 泄漏??????????

    雖然說Goroutine是一個很輕量線程,不應(yīng)該浪費它的。假設(shè)有N多個Goroutine泄漏了會怎么樣?

    大數(shù)據(jù)

    效果見http://talks.bingohuang.com/2017/go-concurrency-visualize/leak.html

    大數(shù)據(jù)

    看起來很漂亮,但它是一個定時炸彈,所以平時編碼的時候一定要注意Goroutine泄漏的問題。

    Gotrace的用法簡介

    最后說一下GoTrace的用法,它本身也是開源的。

    下載方式:go get?-v -u github.com/divan/gotrace

    默認分支(master)是基于?Go?1.6?開發(fā),我建議切換到到 Go18 分支,支持 Go?1.8。

    具體用法如下:

    大數(shù)據(jù)

    直接運行?go 代碼的效果并不好,推薦生成 trace,需在執(zhí)行的代碼上前后加上:

    大數(shù)據(jù)

    結(jié)合?docker ,可以用以下腳本:

    大數(shù)據(jù)

    它會自動打開這個瀏覽器,可以調(diào)整視角,可以縮放、旋轉(zhuǎn)、加粗,改變圖像。
    使用場景

    最后我想說一下使用場景。首先,我看到的時候覺得非???,這會引發(fā)大家對學(xué)習(xí)Go的興趣,同時還可以通過它來學(xué)習(xí) Go 的并發(fā)模式,探索 Go 的并發(fā)過程,希望對大家進一步學(xué)習(xí) Go 語言有所幫助。

    極客網(wǎng)企業(yè)會員

    免責(zé)聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關(guān)資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責(zé)。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負任何法律責(zé)任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實情況說明,并提供身份證明、權(quán)屬證明及詳細侵權(quán)或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實,溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。

    2017-11-10
    可視化學(xué)習(xí)Go并發(fā)編程
    Go 天生是為并發(fā)而生的東西。簡單來說,我覺得并發(fā)可以看作一種程序的構(gòu)造方式,如下圖所示。 并行&并發(fā) 想了解并行和并發(fā)的區(qū)別,推薦看一下Rob

    長按掃碼 閱讀全文