您好,登錄后才能下訂單哦!
這篇文章主要介紹“golang有沒有進程”,在日常操作中,相信很多人在golang有沒有進程問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”golang有沒有進程”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
golang有進程。進程就是程序在操作系統(tǒng)中的一次執(zhí)行過程,是由系統(tǒng)進行資源分配和調(diào)度的基本單位;進程是一個動態(tài)概念,是程序在執(zhí)行過程中分配和管理資源的基本單位,每一個進程都有一個自己的地址空間。go語言支持多進程,它線程模型是MPG模型,整體上Go程與內(nèi)核線程是多對多對應的。
進程就是程序在操作系統(tǒng)中的一次執(zhí)行過程,是由系統(tǒng)進行資源分配和調(diào)度的基本單位,進程是一個動態(tài)概念,是程序在執(zhí)行過程中分配和管理資源的基本單位,每一個進程都有一個自己的地址空間。一個進程至少有5種基本狀態(tài):初始態(tài)、執(zhí)行態(tài)、等待狀態(tài)、就緒狀態(tài)、終止狀態(tài)。
通俗講:進程就是一個正在執(zhí)行的程序。
線程是進程的一個執(zhí)行實例,是程序執(zhí)行的最小單元,它是比進程更小的能獨立運行的基本單位。
通俗講:一個進程可以創(chuàng)建多個線程,同一個進程中的多個線程可以并發(fā)執(zhí)行,一個程序要運行的話至少有一個進程。
多個線程同時競爭一個位置,競爭到的才可以執(zhí)行,每一個時間段只有一個線程在執(zhí)行。
多個線程可以同時執(zhí)行,每一個時間段,可以有多個線程同時執(zhí)行。
多線程程序在單核cpu上運行就是并發(fā),在多核cpu上運行就是并行。如果線程數(shù)大于cpu核數(shù),則多線程程序在多個cpu上既有并發(fā)也有并行。
可以理解為線程或進程,在一個golang程序的主線程上可以啟用多個協(xié)程。golang中多協(xié)程可以實現(xiàn)并發(fā)或者并行。
可以理解為用戶級別的線程,這是對內(nèi)核透明的,也就是系統(tǒng)并不知道有協(xié)程的存在,是完全由用戶自己的程序進行調(diào)度的。golang的一大特色就是從語言方面原生支持協(xié)程,在函數(shù)或方法前面加一個go關鍵詞就可以創(chuàng)建一個協(xié)程。可以說golang中的協(xié)程就是goroutine。
Golang 中的多協(xié)程有點類似其他語言中的多線程。
Golang 中每個 goroutine (協(xié)程) 默認占用內(nèi)存遠比 Java 、C 的線程少。 OS 線程(操作系統(tǒng)線程)一般都有固定的棧內(nèi)存(通常為 2MB 左右),一個 goroutine (協(xié)程) 占用內(nèi)存非常小,只有 2KB 左右,多協(xié)程 goroutine 切換調(diào)度開銷方面遠比線程要少。 這也是為什么越來越多的大公司使用 Golang 的原因之一。
package main
import "fmt"
func test() {
for i := 0; i < 5; i++ {
fmt.Println("test執(zhí)行", i)
}
}
func main() {
// 正常順序執(zhí)行
test()
for i := 0; i < 5; i++ {
fmt.Println("main執(zhí)行", i)
}
/*
test執(zhí)行 0
test執(zhí)行 1
test執(zhí)行 2
test執(zhí)行 3
test執(zhí)行 4
main執(zhí)行 0
main執(zhí)行 1
main執(zhí)行 2
main執(zhí)行 3
main執(zhí)行 4
*/
}
package main
import "fmt"
func test() {
for i := 0; i < 5; i++ {
fmt.Println("test執(zhí)行", i)
}
}
func main() {
// 加入goroutine后
go test()
for i := 0; i < 5; i++ {
fmt.Println("main執(zhí)行", i)
}
/*
main執(zhí)行 0
main執(zhí)行 1
main執(zhí)行 2
main執(zhí)行 3
main執(zhí)行 4
主線程執(zhí)行完畢后,并沒有等待協(xié)程的執(zhí)行
*/
}
package main
import (
"fmt"
"time"
)
// 加入時間
func test1() {
for i := 0; i < 5; i++ {
fmt.Println("test執(zhí)行", i)
time.Sleep(time.Millisecond * 100)
}
}
func main() {
// 加入sleep之后再執(zhí)行
go test1()
for i := 0; i < 5; i++ {
fmt.Println("main執(zhí)行", i)
time.Sleep(time.Millisecond * 100)
}
/*
main執(zhí)行 0
test執(zhí)行 0
test執(zhí)行 1
main執(zhí)行 1
main執(zhí)行 2
test執(zhí)行 2
main執(zhí)行 3
test執(zhí)行 3
test執(zhí)行 4
main執(zhí)行 4
加入相同的睡眠時間后,執(zhí)行的順序不一定,但少量數(shù)據(jù)來看均會執(zhí)行完畢
*/
}
package main
import (
"fmt"
"time"
)
func test1() {
for i := 0; i < 5; i++ {
fmt.Println("test執(zhí)行", i)
time.Sleep(time.Millisecond * 100)
}
}
func main() {
// 如果主線程執(zhí)行的快會出現(xiàn)什么情況?
go test1()
for i := 0; i < 5; i++ {
fmt.Println("main執(zhí)行", i)
time.Sleep(time.Millisecond * 20)
}
/*
main執(zhí)行 0
test執(zhí)行 0
main執(zhí)行 1
main執(zhí)行 2
main執(zhí)行 3
main執(zhí)行 4
test執(zhí)行 1
那么他將不會等待協(xié)程執(zhí)行,就會退出執(zhí)行。
*/
}
package main
import (
"fmt"
"time"
"sync"
)
var wg sync.WiatGroup
func test2() {
for i := 0; i < 5; i++ {
fmt.Println("test執(zhí)行", i)
time.Sleep(time.Millisecond * 100)
}
wg.Done()
}
func main() {
// sync.WaitGroup 完美解決,以后在項目中也會經(jīng)常使用
wg.Add(1)
go test2()
for i := 0; i < 5; i++ {
fmt.Println("main執(zhí)行", i)
time.Sleep(time.Millisecond * 20)
}
wg.Wait()
/*
main執(zhí)行 0
test執(zhí)行 0
main執(zhí)行 1
main執(zhí)行 2
main執(zhí)行 3
main執(zhí)行 4
test執(zhí)行 1
test執(zhí)行 2
test執(zhí)行 3
test執(zhí)行 4
這樣就可以解決主線程執(zhí)行完畢后,不等待等待協(xié)程執(zhí)行完畢就退出的問題。
*/
}
package main
import (
"fmt"
"time"
"sync"
)
func hello(num int) {
defer wg.Done()
for i := 0; i < 5; i++ {
fmt.Printf("第%v個協(xié)程執(zhí)行--%v\n", num, i)
}
}
func main() {
// 多協(xié)程并發(fā)執(zhí)行
for i := 0; i < 3; i++ {
wg.Add(1)
go hello(i)
}
wg.Wait()
/*
第2個協(xié)程執(zhí)行--0
第2個協(xié)程執(zhí)行--1
第2個協(xié)程執(zhí)行--2
第2個協(xié)程執(zhí)行--3
第2個協(xié)程執(zhí)行--4
第0個協(xié)程執(zhí)行--0
第0個協(xié)程執(zhí)行--1
第0個協(xié)程執(zhí)行--2
第0個協(xié)程執(zhí)行--3
第0個協(xié)程執(zhí)行--4
第1個協(xié)程執(zhí)行--0
第1個協(xié)程執(zhí)行--1
第1個協(xié)程執(zhí)行--2
第1個協(xié)程執(zhí)行--3
第1個協(xié)程執(zhí)行--4
*/
}
package main
import (
"fmt"
"runtime"
)
func main() {
// 設置程序占用幾個cpu進行執(zhí)行,默認是全部
// 獲取計算機cpu個數(shù)
cpuNum := runtime.NumCPU()
fmt.Println(cpuNum) // 6 我本機電腦是6核cpu
// 設置占用cpu個數(shù)
runtime.GOMAXPROCS(2)
fmt.Println("ok")
}
到此,關于“golang有沒有進程”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。