Go語言基礎 併發

2021-07-22 21:18:24 字數 2806 閱讀 6880

並行:多件事在同一時刻發生。

併發:多件事在同一時間間隔發生。

摘自: 和 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傳送至...