Go語言學習筆記 併發

2021-08-07 07:36:52 字數 1514 閱讀 1732

區別:

1. 併發:☞邏輯上具備同時處理多個任務的能力,指的是多個任務在同一時間段執行而不是同一時刻

2. 並行:☞物理上同一時刻執行多個任務

goroutine像乙個多執行緒和協程的綜合體,執行時會建立多個限制來執行併發任務,且任務單元可排程到其他執行緒並行執行,最大限度提公升執行效率。

go

println("hello world")

go funct(s)("hello world")

建立併發任務通過go關鍵字就可,但是關鍵字go並非執行併發操作,而是建立乙個併發任務單元,放置於系統佇列中等待排程器排程執行。等待執行過程中,當前流程不會阻塞,也不會等待該任務啟動,存在多個任務時也不會去保證併發任務的執行次序。

每個任務單元相比系統執行緒棧的mb級別來說小了很多,goroutine定義棧初始只需要2kb。自定義棧採用按需分配的策略,在需要時進行擴容,最大能達到gb規模。

package main

import

"time"

var c int

func counter() int

func main() (a, counter())

a +=100

println("main:", a, counter())

time.sleep(time.second *3)

}//輸出結果:

main:200

2go:100

1

go內建csp模型,且鼓勵使用csp通道,以通訊來代替記憶體共享,實現併發安全,不需要開發人員自行維護資料一致和完整性。

channel是顯式的,收發雙方必須都知道資料型別和具體通道。

channel從底層實現上來說是乙個佇列,同步模式下收發雙方必須配對,然後直接複製資料給對方,配對失敗則置入等待佇列,直到出現適配的另一方

非同步模式搶奪的是資料緩衝槽,傳送方要求有空草可供寫入,接收方要求有緩衝資料可讀。

通道除了傳遞資料之外,通常也被用作事件通知。

func main()) //結束事件

c := make(chan

string) //資料傳輸通道

gofunc()()

c <- "hi!"

//傳送資料

<-done //阻塞,置入等待 等待資料或事件通知

}

非同步模式

可以使用len以及cap函式來獲取緩衝區的大小以及緩衝區已緩衝的數量

對於同步模式的channel使用len以及cap返回結果均為0,此不同可用作區分channel是同步還是非同步

import

"unsafe"

func main()

//輸出

//通道中第乙個值: 1

//通道中第二個值: 2

//通道中寫入值的數量: 0

//通道的容積: 3

GO語言學習 併發

goroutine 由go執行環境管理的輕量級執行緒 channel 有型別的管道,操作符為 資料流向箭頭指向的方向 使用make chan 緩衝資料型別 緩衝區長度 來建立 使用close chan 來關閉管道,只有傳送者才允許關閉管道 例ch make chan int 10 ch 10 a c...

GO語言學習 併發

通道channel 併發 concurrency 邏輯上具備同時處理多個任務的能力。並行 parallesim 不同於併發,物理上的同一時刻,相當於併發設計的理想執行模式。在函式呼叫前新增go關鍵字即可建立併發任務 a 100go func x,y int a,counter a a 66print...

go語言學習筆記22 Go語言併發程式設計

goroutine是go語言並行設計的核心,有人稱之為go程。goroutine說到底其實就是協程,它比執行緒更小,十幾個goroutine可能體現在底層就是五六個執行緒,go語言內部幫你實現了這些goroutine之間的記憶體共享。執行goroutine只需極少的棧記憶體 大概是4 5kb 當然會...