golang有程序嗎

2022-12-26 18:00:17

golang有程序。程序就是程式在作業系統中的一次執行過程,是由系統進行資源分配和排程的基本單位;程序是一個動態概念,是程式在執行過程中分配和管理資源的基本單位,每一個程序都有一個自己的地址空間。go語言支援多程序,它執行緒模型是MPG模型,整體上Go程與核心執行緒是多對多對應的。

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

一、關於程序和執行緒

1. 程序(Process)

程序就是程式在作業系統中的一次執行過程,是由系統進行資源分配和排程的基本單位,程序是一個動態概念,是程式在執行過程中分配和管理資源的基本單位,每一個程序都有一個自己的地址空間。一個程序至少有5種基本狀態:初始態、執行態、等待狀態、就緒狀態、終止狀態。

通俗講:程序就是一個正在執行的程式。

2. 執行緒

執行緒是程序的一個執行範例,是程式執行的最小單元,它是比程序更小的能獨立執行的基本單位。

通俗講:一個程序可以建立多個執行緒,同一個程序中的多個執行緒可以並行執行,一個程式要執行的話至少有一個程序。

1.png

2.png

二、關於並行和並行

1. 並行

多個執行緒同時競爭一個位置,競爭到的才可以執行,每一個時間段只有一個執行緒在執行。

3.png

2. 並行

多個執行緒可以同時執行,每一個時間段,可以有多個執行緒同時執行。

4.png

3. 通俗講

多執行緒程式在單核cpu上執行就是並行,在多核cpu上執行就是並行。如果執行緒數大於cpu核數,則多執行緒程式在多個cpu上既有並行也有並行。

三、goroutine協程以及主執行緒

1. 主執行緒

可以理解為執行緒或程序,在一個golang程式的主執行緒上可以啟用多個協程。golang中多協程可以實現並行或者並行。

2. 協程

可以理解為使用者級別的執行緒,這是對核心透明的,也就是系統並不知道有協程的存在,是完全由使用者自己的程式進行排程的。golang的一大特色就是從語言方面原生支援協程,在函數或方法前面加一個go關鍵詞就可以建立一個協程。可以說golang中的協程就是goroutine。

5.png

Golang 中的多協程有點類似其他語言中的多執行緒。

3. 多協程和多執行緒

Golang 中每個 goroutine (協程) 預設佔用記憶體遠比 Java 、C 的執行緒少。 OS 執行緒(作業系統執行緒)一般都有固定的棧記憶體(通常為 2MB 左右),一個 goroutine (協程) 佔用記憶體非常小,只有 2KB 左右,多協程 goroutine 切換排程開銷方面遠比執行緒要少。 這也是為什麼越來越多的大公司使用 Golang 的原因之一。

四、go關鍵詞實操

1. 順序執行

package main

import "fmt"

func test() {
	for i := 0; i < 5; i++ {
		fmt.Println("test執行", i)
	}
}

func main() {
    // 正常順序執行
	test()
	for i := 0; i < 5; i++ {
		fmt.Println("main執行", i)
	}
	/*
		test執行 0
		test執行 1
		test執行 2
		test執行 3
		test執行 4
		main執行 0
		main執行 1
		main執行 2
		main執行 3
		main執行 4
	*/
}
登入後複製

2. 加入go

package main

import "fmt"

func test() {
	for i := 0; i < 5; i++ {
		fmt.Println("test執行", i)
	}
}

func main() {
    // 加入goroutine後
	go test()
	for i := 0; i < 5; i++ {
		fmt.Println("main執行", i)
	}
	/*
		main執行 0
		main執行 1
		main執行 2
		main執行 3
		main執行 4
		主執行緒執行完畢後,並沒有等待協程的執行
	*/
}
登入後複製

3. 加入時間

package main

import (
    "fmt"
    "time"
)

// 加入時間
func test1() {
	for i := 0; i < 5; i++ {
		fmt.Println("test執行", i)
		time.Sleep(time.Millisecond * 100)
	}
}

func main() {
    // 加入sleep之後再執行
	go test1()
	for i := 0; i < 5; i++ {
		fmt.Println("main執行", i)
		time.Sleep(time.Millisecond * 100)
	}
	/*
		main執行 0
		test執行 0
		test執行 1
		main執行 1
		main執行 2
		test執行 2
		main執行 3
		test執行 3
		test執行 4
		main執行 4
		加入相同的睡眠時間後,執行的順序不一定,但少量資料來看均會執行完畢
	*/
}
登入後複製

4. 主執行緒執行快的情況

package main

import (
    "fmt"
    "time"
)

func test1() {
	for i := 0; i < 5; i++ {
		fmt.Println("test執行", i)
		time.Sleep(time.Millisecond * 100)
	}
}

func main() {
    // 如果主執行緒執行的快會出現什麼情況?
	go test1()
	for i := 0; i < 5; i++ {
		fmt.Println("main執行", i)
		time.Sleep(time.Millisecond * 20)
	}
	/*
		main執行 0
		test執行 0
		main執行 1
		main執行 2
		main執行 3
		main執行 4
		test執行 1
		那麼他將不會等待協程執行,就會退出執行。
	*/
}
登入後複製

5. sync.WaitGroup解決不等待

package main

import (
    "fmt"
    "time"
    "sync"
)

var wg sync.WiatGroup

func test2() {
	for i := 0; i < 5; i++ {
		fmt.Println("test執行", i)
		time.Sleep(time.Millisecond * 100)
	}
	wg.Done()
}

func main() {
    // sync.WaitGroup 完美解決,以後在專案中也會經常使用
	wg.Add(1)
	go test2()
	for i := 0; i < 5; i++ {
		fmt.Println("main執行", i)
		time.Sleep(time.Millisecond * 20)
	}
	wg.Wait()
	/*
		main執行 0
		test執行 0
		main執行 1
		main執行 2
		main執行 3
		main執行 4
		test執行 1
		test執行 2
		test執行 3
		test執行 4
		這樣就可以解決主執行緒執行完畢後,不等待等待協程執行完畢就退出的問題。
	*/
}
登入後複製

6. 多協程並行並行執行

package main

import (
    "fmt"
    "time"
    "sync"
)

func hello(num int) {
	defer wg.Done()
	for i := 0; i < 5; i++ {
		fmt.Printf("第%v個協程執行--%v\n", num, i)
	}

}

func main() {
    // 多協程並行執行
	for i := 0; i < 3; i++ {
		wg.Add(1)
		go hello(i)
	}
	wg.Wait()
	/*
		第2個協程執行--0
		第2個協程執行--1
		第2個協程執行--2
		第2個協程執行--3
		第2個協程執行--4
		第0個協程執行--0
		第0個協程執行--1
		第0個協程執行--2
		第0個協程執行--3
		第0個協程執行--4
		第1個協程執行--0
		第1個協程執行--1
		第1個協程執行--2
		第1個協程執行--3
		第1個協程執行--4
	*/
}
登入後複製

五、設定golang執行時佔用的cpu核數量(不是很重要)

package main

import (
    "fmt"
    "runtime"
)

func main() {
    // 設定程式佔用幾個cpu進行執行,預設是全部
	// 獲取計算機cpu個數
	cpuNum := runtime.NumCPU()
	fmt.Println(cpuNum) // 6 我本機電腦是6核cpu

	// 設定佔用cpu個數
	runtime.GOMAXPROCS(2)
	fmt.Println("ok")
}
登入後複製

更多程式設計相關知識,請存取:!!

以上就是golang有程序嗎的詳細內容,更多請關注TW511.COM其它相關文章!