Go 的 Concurrency 不是平行化

mingderwang
2 min readDec 11, 2016

--

第二堂 Go 語言的課, 找題目真的比第一堂難很多, 挑了相當多的主題, 都無法像 Hello World 一樣的平易近人. 但我還是決定介紹它的 concurrency (姑且稱它為 ”並行處理”)

Concurrency 跟平行化 (Parallelism) 不樣, 一開始我也以為有了 Go 就能用它的 gorouting 快速的做平行化, 讓一個程式能跨好多個 CPUs 同時執行; 錯了, concurrency 是讓你模擬多件事情同時進行, 但只能在單一 CPU 核裡執行.

其實世上的所有事物, 大部分都是屬於 Concurrency 方式在進行, 所以寫程式變得非處理這類平行發生的事不可. 寫過 Java 的人就知道, 到了 Java 8 也才正式提供 concurrency 相關的指令, 但你還是要自己處理 threads, locks, 同步與非同步等問題, 通常這就是災難的開始.

這就要提到 Go 是如何簡單的處理這些問題, 它只用到 goroutings 還有 channels, 再加上 select 指令就能輕易的寫出並行處理的程式. 下圖是 golang playground 介紹 goroutines.go 的範例, main() 是程式一開始執行的地方, 第一個 say(“world”) 前面加個 go 字, 就變成 goroutine 了. 也就是說, 不必等它執行完畢, 就能開始執行下一個 say(“hello”), 每一個 say() 各說 5 次, 因此按了藍色的 [Run] 按鈕, hello 跟 world 會同時開始, 交錯出現; 就像聽到 party 裡的人, 講話聲音都是混雜在一起的.

習題 1. say(“hello”) 前面也加個 go 可不可以?

習題 2. 讓每個人都各講 10 次, 從 5 變成 10, 要改哪裡?

--

--

mingderwang
mingderwang

Written by mingderwang

AI, DevOps, Ethereum enthusiast

No responses yet