並行:多件事在同一時刻發生。
併發:多件事在同一時間間隔發生。
摘自: 和 concurrent and parallel programming
上文如果用程式設計師的語言來講,cpu處理器相當於上圖的咖啡機的角色,任務相當於佇列中的人。
一定要仔細閱讀此文:。這篇文章提到了網路伺服器併發連線數、吐吞量、寬頻的概念,對於初學者應該很受用。
我們知道go從語言層面就支援了併發,而goruntine是go併發設計的核心。goruntine說到底是協程【go web 程式設計裡是執行緒,也是對的,因為協程類似於使用者態執行緒】。具體原理實現參考:
1. 以goroutine為例看協程的相關概念
2. goroutine與排程器
3. 廖雪峰:協程
4. 知乎:協程的好處是什麼?
5. 知乎:golang的goroutine是如何實現的?
這些參考文章建議讀者好好看看。
了解了協程、goruntine的實現機制,接下來學習如何啟動goruntine。
goroutine 通過關鍵字 go 就啟動了乙個 goroutine。
go hello(a, b, c)//普通函式前加go
例子:
package main
import (
"fmt"
"runtime"
)func say(s string)
}func main()
輸出:
hello
world
hello
world
hello
world
hello
world
hello
channel是一種通訊通道,goruntine之間的資料通訊通過channel來實現。goruntine通過channel傳送或者接收訊息。
cl := make(chan
int) //建立乙個無緩衝的int型channel,可以根據需求建立bool、string等型別的channel
c1 := make(chan
int,4) //建立有緩衝的int型channel
cl x :=
package main
import (
"fmt"
"time"
)func sendchan(cl chan
string)
func getchan(cl chan
string)
func main()
輸出:
[send_start]
[get_start]
[get_end]
hello
world
[send_end]
上面的例子存在3個goruntine,注意main也在乙個goruntine中。如果函式main中沒有 time.sleep(time.second),你會發現什麼輸出都不會有,為什麼呢?是因為另外兩個goruntine還沒來得及跑,主函式main就已經退出了。
所以需要讓main等一下,time.sleep(time.second)就是讓main停頓一秒再輸出。
無緩衝的channel的接收和傳送都是阻塞的,也就是說:
package main
import (
"fmt"
"time"
)func sendchan(cl chan
int, len
int)
fmt.println("sendchan_end")
}func getchan(cl chan
int, len
int)
fmt.println("getchan_end")
}func main()
輸出:
sendchan_enter
# 0
# 1
# 2
# 3
getchan_enter
$ 0
$ 1
$ 2
$ 3
# 4
# 5
# 6
# 7
# 8
$ 4
getchan_end
為什麼sendchan_end沒有輸出?
getchan取完5個資料後,getchan這個goruntine就會掛起,而sendchan執行緒因為資料填滿,無法將剩餘的資料寫入chanl而掛起,最後因main所在的goruntine超時1秒結束而結束。故而看不到sendchan_end的輸出。
生產者【傳送channel的goruntine】通過關鍵字 close 函式關閉 channel。關閉 channel 之後就無法再傳送任何資料了, 在消費方【接收channel的goruntine】可以通過語法 v, ok :=
不過一般用得少,網上關於它的描述也不多。
語法結構類似於switch。
select
關於select的用法,強烈推薦閱讀:【golang】go語言學習-select用 go語言基礎 併發
併發性 並行性 concurrency併發性 同時可以執行多條路徑,但是同一時間點上,只能執行1個。parallelism並行性 多條路徑同時執行,真正的並行多核支援。2.程序,執行緒,協程 多工 程序process 正在執行的程式。執行緒thread 程序中的一條執行路徑。協程coroutine ...
Go語言併發
協程 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現重寄存於執行緒中,因此,系統開銷極小,可以有效提高執行緒的任務併發性,從而避免多執行緒的缺點。使用協程的優點是程式設計簡單,結構清晰 缺點是需要語言的支援。協程最大優勢 輕量級 可以輕鬆建立上百萬個而不會導致系統資源衰竭...
Go語言程式設計基礎 併發 一 Go程 通道
go程 goroutine 是由go執行時管理的輕量級執行緒。啟動乙個go程並執行f x,y,z gof x,y,z package main import fmt time func fff s string func main 通道是帶有型別的管道,可以使用通道操作符 來傳送或接收值。將v傳送至...