偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

可視化學習 Go并發(fā)編程

開發(fā) 后端 大數據
想了解并行和并發(fā)的區(qū)別,推薦看一下Rob Pike的分享(點擊閱讀原文即可跳轉)。在這個視頻里,他用形象的Gopher動圖,講解了Go并發(fā)的過程。

并行&并發(fā)

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

總結他的觀點如下:

  • 并發(fā)很強大
  • 并發(fā)幫助實現并行,使并行(擴展等)變得容易
  • 并發(fā)不是并行,并發(fā)重點是架構,并行重點是執(zhí)行,兩者不同,但相關。

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

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

并行:http://talks.bingohuang.com/2017/go-concurrency-visualize/parallelism.html

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

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

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

可視化學習 Go并發(fā)編程

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

Go 語言中的并發(fā)

Goroutine - 并發(fā)執(zhí)行

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

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

可視化學習 Go并發(fā)編程

Channel

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

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

可視化學習 Go并發(fā)編程

Select

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

可視化學習 Go并發(fā)編程

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

但問題來了:

  • 我們怎樣去講解 Go 的并發(fā)?
  • 我們怎樣思考 Go 的并發(fā)過程?
  • 最終,我們怎樣更好的實踐 Go 并發(fā)編程?
  • 這里祭出一個法寶——GoTrace,它是一個能將 Go 并發(fā)過程可視化的開
  • gotrace(go):分析 go tool trace 的執(zhí)行結果
  • gothree(js): 基于 ThreeJs 和 WebGL 生成 3D 圖像

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

耳聽為虛,眼見為實

1.Hello,World!

可視化學習 Go并發(fā)編程

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

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

可視化學習 Go并發(fā)編程

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

2.計時器

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

可視化學習 Go并發(fā)編程

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

可視化學習 Go并發(fā)編程

非常的形象,是不是?

3.兵乓球

兩個玩家

可視化學習 Go并發(fā)編程

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

可視化學習 Go并發(fā)編程

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

三個玩家

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

可視化學習 Go并發(fā)編程

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

可視化學習 Go并發(fā)編程

36個玩家

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

可視化學習 Go并發(fā)編程

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

可視化學習 Go并發(fā)編程

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

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

4.素數篩

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

可視化學習 Go并發(fā)編程

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

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

可視化學習 Go并發(fā)編程

可視化學習 Go并發(fā)編程

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

可視化學習 Go并發(fā)編程

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

非常漂亮的算法,特別是在 3D 圖像下。

5.其他-Goroutines 泄漏

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

可視化學習 Go并發(fā)編程

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

可視化學習 Go并發(fā)編程

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

Gotrace的用法簡介

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

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

具體用法如下:

可視化學習 Go并發(fā)編程

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

 

可視化學習 Go并發(fā)編程

結合 docker ,可以用以下腳本:

可視化學習 Go并發(fā)編程

責任編輯:未麗燕 來源: 推酷
相關推薦

2022-10-17 08:07:13

Go 語言并發(fā)編程

2023-10-06 23:31:25

可視化Go

2023-09-15 11:32:18

selectGo可視化解釋

2023-09-25 12:45:45

Go 語言可視化sync.Mute

2023-09-11 10:17:20

Go編程語言

2023-10-20 13:35:19

GoWaitGroup

2022-04-24 15:29:17

微服務go

2023-11-27 18:07:05

Go并發(fā)編程

2024-07-08 00:01:00

GPM模型調度器

2025-06-17 09:32:15

2023-02-10 09:40:36

Go語言并發(fā)

2023-10-28 15:37:39

Go編程語言

2024-09-06 10:48:13

2021-02-07 20:23:09

GoogeBlockly可視化編程

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2020-01-14 11:17:33

Go并發(fā)Linux

2011-06-13 18:54:12

2020-05-08 13:44:26

Spark架構RDD

2017-04-19 08:32:50

大數據數據可視化編程工具

2024-04-11 07:40:55

Go并發(fā)編程
點贊
收藏

51CTO技術棧公眾號