GO語言學習 併發

2021-10-02 04:58:53 字數 3501 閱讀 9982

通道channel

併發(concurrency):邏輯上具備同時處理多個任務的能力。

並行(parallesim)不同於併發,物理上的同一時刻,相當於併發設計的理想執行模式。

在函式呼叫前新增go關鍵字即可建立併發任務

a :=

100go

func

(x, y int

)(a,

counter()

)a = a +

66println

("main:"

,a,counter()

)

輸出:

main: 166 2

go: 100 1

等待併發任務結束

1.通道channel

2.sync.waitgroup

設定計數器,讓goroutine在退出前遞減,在歸零時解除阻塞。

gomaxprocs

修改執行時的執行緒數量

runtime.gomaxprocs(),引數<1時,返回當前設定值,不作調整

實現local storage

goroutine沒有區域性儲存,無法獲取編號,返回值也會被拋棄,需自己寫方法實現

不適用waitgroup時:

//var wg sync.waitgroup

var gs [5]

struct

for i :=

0;i <

len(gs)

;i++

(i)}

fmt.

printf

("%+v\n"

,gs)

輸出為:

程式併發,未等到多個任務結束時就退出程序

var wg sync.waitgroup

var gs [5]

struct

for i :=

0;i <

len(gs)

;i++

(i)}

wg.wait()

fmt.

printf

("%+v\n"

,gs)

}

goexit

goexit立即終止當前任務;

不會影響其他併發任務,不會引發panic。

在main.main中呼叫goexit,他會等待其他任務結束,然後讓程序直接崩潰。

(聽起來很任性hhh)

底層看來,通道相當於乙個佇列。

同步模式:傳送和接收方配對,直接將資料賦值給對方;配對失敗時,進入等待佇列,知道另一方出現後喚醒。

必須有配對操作的goroutine出現,否則阻塞。

非同步模式:搶奪資料緩衝槽,傳送方需要寫入,接收方需要緩衝資料可讀。

非同步通道有助於提公升效能,減少排隊阻塞。

此外,通道還被用作事件通知。

//訊號通知

done :=

make

(chan

struct

)//結束事件

//chan struct{}:不能被寫入任何資料,不占用任何記憶體。

//必須通過close進行關閉操作才能輸出

c :=

make

(chan

string

)//資料傳輸通道

gofunc()

()c

"hello!"

//傳送訊息

println

(c)//輸出位址?

//非同步

c1 :=

make

(chan

int,3)

//建立帶有3個緩衝槽的非同步通道

c1 1c1

2println

(println

(//println(

通道變數本身就是指標可以判斷是否為同一物件或者nil。

可用caplen函式判斷同步/非同步,同步通道兩者都返回0.

cap:返回已緩衝數量

len:返回緩衝區大小

println

("c:"

,len

(c),

cap(c)

)println

("c1:"

,len

(c1)

,cap

(c1)

)

var wg sync.waitgroup

ready :=

make

(chan

struct

)for i :=

0; i <

3;i++

(i)}

time.

sleep

(time.second)

println

("ready?go!"

)close

(ready)

//peng!

wg.wait

()

輸出:併發事件不保證輸出順序(?)

已關閉通道:

傳送資料->引發panic

接收資料->返回已緩衝資料或零值

nil通道:

收發都會阻塞

單向通道

使用型別轉換獲取單向通道,並分別賦予操作雙方

//單向操作

var wg sync.waitgroup

wg.add(2

)//收 發,引數為2

c1way :=

make

(chan

int)

var send chan

int= c1way

var recv

chan

int= c1way

gofunc()

}()go

func()

}()wg.

wait()

//禁止逆向操作

////recv

//close(recv) //invalid operation: close(recv) (cannot close receive-only channel)

//單向不可逆

//c2ways := (chan int)(recv) //cannot convert recv (type

//c2ways = (chan int)(send) //cannot convert send (type chan

輸出結果:

通道還可以實現訊號量機制

以及同步。

GO語言學習 併發

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

Go語言學習筆記 併發

區別 1.併發 邏輯上具備同時處理多個任務的能力,指的是多個任務在同一時間段執行而不是同一時刻 2.並行 物理上同一時刻執行多個任務 goroutine像乙個多執行緒和協程的綜合體,執行時會建立多個限制來執行併發任務,且任務單元可排程到其他執行緒並行執行,最大限度提公升執行效率。go println...

go語言學習備忘 併發

並行是讓不同的 片段同時在不同的物理處理器上執行。並行的關鍵是同時做很多事情,而併發是指同時管理很多事情,這些事情可能只做了一半就被暫停去做別的事情了。在很多情況下,併發的效果比並行好,因為作業系統和硬體的總資源一般很少,但能支援系統同時做很多事情。這種 使用較少的資源做更多的事情 的哲學,也是指導...