go語言層面並發的意思是利用go語言在同一時間段內執行多個任務,Go語言的並發透過goroutine實現,goroutine類似線程,屬於用戶態的線程,可以根據需要創建成千上萬個goroutine並發工作。
本文的操作環境:Windows10系統、go1.20版本、dell g3電腦。
go語言層面並發的意思是利用go語言在同一時間段內執行多個任務。
並發是程式設計裡面一個很重要的概念,Go語言在語言層面天生就支持並發。
並發與並行
並發:在同一時間段內執行多個任務(例如:用微信和兩個女朋友聊天)。
並行:在同一時刻執行多個任務(例如:你和你的朋友都在用微信和女朋友聊天)。
Go語言的並發透過goroutine實現,goroutine類似線程(線程和進程是操作系統引申出的概念,進程相當於一個大的車間,CPU相當於一個工廠,一個工廠裡有很多個車間,進程把工廠分為一個個車間。線程是進程下分的,例如工人和各種在進程上的資源。一個進程里至少有一個線程。),屬於用戶態的線程,我們可以根據需要創建成千上萬個goroutine並發工作。 goroutine是由Go語言的運行時(runtime)調度完成,二線程是由作業系統調度完成。
Go語言也提供channel(通道)在多個goroutine間進行通訊。 goroutine和channel是Go語言秉承CSP(提倡透過通訊共享記憶體而不是透過共享記憶體而實現通訊)並發模式的重要實作基礎
拓展:
goroutine
類似線程,在語言層面實現,在作業系統的執行緒上運行。
一個 goroutine 必定對應一個函數,可以建立多個 goroutine 去執行相同的函數。
在 go中使用 goroutine 很方便,在呼叫函數時在前面加上go關鍵字,就可以為一個函數建立一個goroutine 。
啟動單一goroutine:
package main import ( "fmt" "sync" ) var wg sync.WaitGroup //WaitGroup等待方法 // goroutine demo func hello(i int){ fmt.Println("Hello hello",i) wg.Done() //此方法如果运行 ,通知wg把计数器 -1 } func main() { // 开启一个主goroutine去执行mian函数 wg.Add(10000)//(计数器)只有一个小弟为1,等待wg.Done()后-1,为0时停止等待 for i:=0; i<10000;i++{ //wg.Add(1) 可以给定10000个goroutine 也可以,每次循环+1 go hello(i) // 开启了一个独立的 goroutine去执行hello这个函数 } fmt.Println("Hello main") // 让我们的主goroutine 等待 goroutine 小弟 执行 // 如果不等待,独立的goroutine小弟,可能小弟这个goroutine还没有运行 //time.Sleep(time.Second) 第二种等待 wg.Wait()//等待所有小弟干完活 }
goroutine和線程的區別
OS線程(作業系統線程)一本都有固定的堆疊記憶體(通常為2MB),一個goroutine的棧在其生命週期開始時只有很小的棧(典型情況下2KB),goroutine的棧不是固定的,他可以按需增大和縮小,grorutine的棧大小限制可以達到1GB ,但極少情況下會到1GB。所以在Go語言中一次創造十萬左右的grorutine也是可以的。
以上是go語言層面並發什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!