首頁  >  文章  >  go語言層面並發什麼意思

go語言層面並發什麼意思

DDD
DDD原創
2023-06-12 15:11:49907瀏覽

go語言層面並發的意思是利用go語言在同一時間段內執行多個任務,Go語言的並發透過goroutine實現,goroutine類似線程,屬於用戶態的線程,可以根據需要創建成千上萬個goroutine並發工作。

go語言層面並發什麼意思

本文的操作環境: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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn