這篇文章主要介紹“golang有沒(méi)有進(jìn)程”,在日常操作中,相信很多人在golang有沒(méi)有進(jìn)程問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”golang有沒(méi)有進(jìn)程”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)由有經(jīng)驗(yàn)的網(wǎng)站設(shè)計(jì)師、開(kāi)發(fā)人員和項(xiàng)目經(jīng)理組成的專(zhuān)業(yè)建站團(tuán)隊(duì),負(fù)責(zé)網(wǎng)站視覺(jué)設(shè)計(jì)、用戶(hù)體驗(yàn)優(yōu)化、交互設(shè)計(jì)和前端開(kāi)發(fā)等方面的工作,以確保網(wǎng)站外觀精美、成都做網(wǎng)站、成都網(wǎng)站制作易于使用并且具有良好的響應(yīng)性。
golang有進(jìn)程。進(jìn)程就是程序在操作系統(tǒng)中的一次執(zhí)行過(guò)程,是由系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位;進(jìn)程是一個(gè)動(dòng)態(tài)概念,是程序在執(zhí)行過(guò)程中分配和管理資源的基本單位,每一個(gè)進(jìn)程都有一個(gè)自己的地址空間。go語(yǔ)言支持多進(jìn)程,它線程模型是MPG模型,整體上Go程與內(nèi)核線程是多對(duì)多對(duì)應(yīng)的。
進(jìn)程就是程序在操作系統(tǒng)中的一次執(zhí)行過(guò)程,是由系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,進(jìn)程是一個(gè)動(dòng)態(tài)概念,是程序在執(zhí)行過(guò)程中分配和管理資源的基本單位,每一個(gè)進(jìn)程都有一個(gè)自己的地址空間。一個(gè)進(jìn)程至少有5種基本狀態(tài):初始態(tài)、執(zhí)行態(tài)、等待狀態(tài)、就緒狀態(tài)、終止?fàn)顟B(tài)。
通俗講:進(jìn)程就是一個(gè)正在執(zhí)行的程序。
線程是進(jìn)程的一個(gè)執(zhí)行實(shí)例,是程序執(zhí)行的最小單元,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。
通俗講:一個(gè)進(jìn)程可以創(chuàng)建多個(gè)線程,同一個(gè)進(jìn)程中的多個(gè)線程可以并發(fā)執(zhí)行,一個(gè)程序要運(yùn)行的話至少有一個(gè)進(jìn)程。
多個(gè)線程同時(shí)競(jìng)爭(zhēng)一個(gè)位置,競(jìng)爭(zhēng)到的才可以執(zhí)行,每一個(gè)時(shí)間段只有一個(gè)線程在執(zhí)行。
多個(gè)線程可以同時(shí)執(zhí)行,每一個(gè)時(shí)間段,可以有多個(gè)線程同時(shí)執(zhí)行。
多線程程序在單核cpu上運(yùn)行就是并發(fā),在多核cpu上運(yùn)行就是并行。如果線程數(shù)大于cpu核數(shù),則多線程程序在多個(gè)cpu上既有并發(fā)也有并行。
可以理解為線程或進(jìn)程,在一個(gè)golang程序的主線程上可以啟用多個(gè)協(xié)程。golang中多協(xié)程可以實(shí)現(xiàn)并發(fā)或者并行。
可以理解為用戶(hù)級(jí)別的線程,這是對(duì)內(nèi)核透明的,也就是系統(tǒng)并不知道有協(xié)程的存在,是完全由用戶(hù)自己的程序進(jìn)行調(diào)度的。golang的一大特色就是從語(yǔ)言方面原生支持協(xié)程,在函數(shù)或方法前面加一個(gè)go關(guān)鍵詞就可以創(chuàng)建一個(gè)協(xié)程??梢哉f(shuō)golang中的協(xié)程就是goroutine。
Golang 中的多協(xié)程有點(diǎn)類(lèi)似其他語(yǔ)言中的多線程。
Golang 中每個(gè) goroutine (協(xié)程) 默認(rèn)占用內(nèi)存遠(yuǎn)比 Java 、C 的線程少。 OS 線程(操作系統(tǒng)線程)一般都有固定的棧內(nèi)存(通常為 2MB 左右),一個(gè) goroutine (協(xié)程) 占用內(nèi)存非常小,只有 2KB 左右,多協(xié)程 goroutine 切換調(diào)度開(kāi)銷(xiāo)方面遠(yuǎn)比線程要少。 這也是為什么越來(lái)越多的大公司使用 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í)行完畢后,并沒(méi)有等待協(xié)程的執(zhí)行
*/
}
package main
import (
"fmt"
"time"
)
// 加入時(shí)間
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
加入相同的睡眠時(shí)間后,執(zhí)行的順序不一定,但少量數(shù)據(jù)來(lái)看均會(huì)執(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í)行的快會(huì)出現(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
那么他將不會(huì)等待協(xié)程執(zhí)行,就會(huì)退出執(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 完美解決,以后在項(xiàng)目中也會(huì)經(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í)行完畢就退出的問(wèn)題。
*/
}
package main
import (
"fmt"
"time"
"sync"
)
func hello(num int) {
defer wg.Done()
for i := 0; i < 5; i++ {
fmt.Printf("第%v個(gè)協(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個(gè)協(xié)程執(zhí)行--0
第2個(gè)協(xié)程執(zhí)行--1
第2個(gè)協(xié)程執(zhí)行--2
第2個(gè)協(xié)程執(zhí)行--3
第2個(gè)協(xié)程執(zhí)行--4
第0個(gè)協(xié)程執(zhí)行--0
第0個(gè)協(xié)程執(zhí)行--1
第0個(gè)協(xié)程執(zhí)行--2
第0個(gè)協(xié)程執(zhí)行--3
第0個(gè)協(xié)程執(zhí)行--4
第1個(gè)協(xié)程執(zhí)行--0
第1個(gè)協(xié)程執(zhí)行--1
第1個(gè)協(xié)程執(zhí)行--2
第1個(gè)協(xié)程執(zhí)行--3
第1個(gè)協(xié)程執(zhí)行--4
*/
}
package main
import (
"fmt"
"runtime"
)
func main() {
// 設(shè)置程序占用幾個(gè)cpu進(jìn)行執(zhí)行,默認(rèn)是全部
// 獲取計(jì)算機(jī)cpu個(gè)數(shù)
cpuNum := runtime.NumCPU()
fmt.Println(cpuNum) // 6 我本機(jī)電腦是6核cpu
// 設(shè)置占用cpu個(gè)數(shù)
runtime.GOMAXPROCS(2)
fmt.Println("ok")
}
到此,關(guān)于“golang有沒(méi)有進(jìn)程”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!