go語言學習(六) 併發程式設計

2022-07-13 08:06:12 字數 1976 閱讀 1740

併發程式設計這塊斷斷續續看了挺久的,&感覺還是有地方沒有理解。有時間還是要找找正式的**看一看,不然不知道怎麼用啊。

有些地方不清楚該怎麼用,所以下面寫的有些亂,再有新的理解再進行補充。。。

// gostudy0228 project main.go

/*go語言學習——併發程式設計

go語言中支援輕量級執行緒goroutine

go語言中以訊息機制作為通訊方式

*/package main

import (

"fmt"

"sync"

"time"

)func main() //定義陣列

var v3 chan bool = make(chan bool, 10) //另一種定義chan的方式,後面的10,是快取空間的大小,快取區在被填滿的時候是阻塞的

go add(v1, v3) //go關鍵字啟動goroutine

v1 <- v2 //將v2傳入chan,在goroutine沒有建立的時候,不能向v1傳值。

var v4 bool = <-v3 //這裡進行阻塞,直到add函式向chan中傳入值以後才能夠繼續執行。不然可能goroutine沒有執行完,main就已經執行完了。

fmt.println(v4) //可以將add函式的isfinished去掉,然後執行看結果,就知道為什麼要額外加乙個chan了

v6 := make(chan int, 10)

timeout := make(chan bool)

go timewait(timeout) //一種超時處理方式,但目前沒有理解號怎麼用

select

//------------------------------

//單向chan的建立

//v21 := make(chan int, 1024) //基於v21建立單向chan

//v22 := <-chan int(v21) //唯讀

//v23 := chan<- int(v21) //只寫

close(v1) //關閉管道v1

_, ok1 := <-v1

fmt.println("v1 is open?", ok1)

//------------------------------

//同步鎖

//var v31 sync.mutex int//單一讀寫

//var v32 sync.rwmutex float32//單寫多讀

鎖定和解鎖要對應,否則死鎖卡死

//defer v31.unlock()//這個函式崩潰的時候執行這句,解除鎖定

//defer v32.runlock()

//------------------------------

var v41 sync.once //全域性唯一,多個呼叫的時候,會阻塞,乙個執行完才進行下乙個

v41.do(func() )

} //程式執行到這退出

func add(ch chan [2]int, isfinished chan bool)

isfinished <- true

}func timewait(isfinished chan bool)

/*幾種多執行緒的方式

1.多程序,作業系統層面,開銷大

2.多執行緒,系統層面,使用最多,最有效,開銷較大,高併發對效能有影響

3.基於回掉的非阻塞/非同步io,通過事件驅動方式使用非同步io,盡可能少用執行緒,降低開銷,但程式設計比多執行緒要複雜

4.協程,有效解決高併發問題,系統開銷極小,程式設計簡單,結構清晰,但是需要語言支援(或者使用者自行拓展)

*//*

執行緒間通訊:共享記憶體模式,訊息傳遞模式

*/

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 當然會...