golang有程序。程序就是程式在作業系統中的一次執行過程,是由系統進行資源分配和排程的基本單位;程序是一個動態概念,是程式在執行過程中分配和管理資源的基本單位,每一個程序都有一個自己的地址空間。go語言支援多程序,它執行緒模型是MPG模型,整體上Go程與核心執行緒是多對多對應的。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
程序就是程式在作業系統中的一次執行過程,是由系統進行資源分配和排程的基本單位,程序是一個動態概念,是程式在執行過程中分配和管理資源的基本單位,每一個程序都有一個自己的地址空間。一個程序至少有5種基本狀態:初始態、執行態、等待狀態、就緒狀態、終止狀態。
通俗講:程序就是一個正在執行的程式。
執行緒是程序的一個執行範例,是程式執行的最小單元,它是比程序更小的能獨立執行的基本單位。
通俗講:一個程序可以建立多個執行緒,同一個程序中的多個執行緒可以並行執行,一個程式要執行的話至少有一個程序。
多個執行緒同時競爭一個位置,競爭到的才可以執行,每一個時間段只有一個執行緒在執行。
多個執行緒可以同時執行,每一個時間段,可以有多個執行緒同時執行。
多執行緒程式在單核cpu上執行就是並行,在多核cpu上執行就是並行。如果執行緒數大於cpu核數,則多執行緒程式在多個cpu上既有並行也有並行。
可以理解為執行緒或程序,在一個golang程式的主執行緒上可以啟用多個協程。golang中多協程可以實現並行或者並行。
可以理解為使用者級別的執行緒,這是對核心透明的,也就是系統並不知道有協程的存在,是完全由使用者自己的程式進行排程的。golang的一大特色就是從語言方面原生支援協程,在函數或方法前面加一個go關鍵詞就可以建立一個協程。可以說golang中的協程就是goroutine。
Golang 中的多協程有點類似其他語言中的多執行緒。
Golang 中每個 goroutine (協程) 預設佔用記憶體遠比 Java 、C 的執行緒少。 OS 執行緒(作業系統執行緒)一般都有固定的棧記憶體(通常為 2MB 左右),一個 goroutine (協程) 佔用記憶體非常小,只有 2KB 左右,多協程 goroutine 切換排程開銷方面遠比執行緒要少。 這也是為什麼越來越多的大公司使用 Golang 的原因之一。
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
*/
}
登入後複製
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
主執行緒執行完畢後,並沒有等待協程的執行
*/
}
登入後複製
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
加入相同的睡眠時間後,執行的順序不一定,但少量資料來看均會執行完畢
*/
}
登入後複製
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
那麼他將不會等待協程執行,就會退出執行。
*/
}
登入後複製
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
這樣就可以解決主執行緒執行完畢後,不等待等待協程執行完畢就退出的問題。
*/
}
登入後複製
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
*/
}
登入後複製
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其它相關文章!