这篇文章主要介绍“golang有没有进程”,在日常操作中,相信很多人在Golang有没有进程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang有没有进程”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
这篇文章主要介绍“golang有没有进程”,在日常操作中,相信很多人在Golang有没有进程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang有没有进程”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
golang有进程。进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位;进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。go语言支持多进程,它线程模型是MPG模型,整体上Go程与内核线程是多对多对应的。
进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始态、执行态、等待状态、就绪状态、终止状态。
通俗讲:进程就是一个正在执行的程序。
线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。
通俗讲:一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。
多个线程同时竞争一个位置,竞争到的才可以执行,每一个时间段只有一个线程在执行。
多个线程可以同时执行,每一个时间段,可以有多个线程同时执行。
多线程程序在单核cpu上运行就是并发,在多核cpu上运行就是并行。如果线程数大于cpu核数,则多线程程序在多个cpu上既有并发也有并行。
可以理解为线程或进程,在一个golang程序的主线程上可以启用多个协程。golang中多协程可以实现并发或者并行。
可以理解为用户级别的线程,这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的。golang的一大特色就是从语言方面原生支持协程,在函数或方法前面加一个go关键词就可以创建一个协程。可以说golang中的协程就是goroutine。
Golang 中的多协程有点类似其他语言中的多线程。
Golang 中每个 goroutine (协程) 默认占用内存远比 Java 、C 的线程少。 OS 线程(操作系统线程)一般都有固定的栈内存(通常为 2MB 左右),一个 goroutine (协程) 占用内存非常小,只有 2KB 左右,多协程 goroutine 切换调度开销方面远比线程要少。 这也是为什么越来越多的大公司使用 Golang 的原因之一。
package mainimport "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)}}
package mainimport "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)}}
package mainimport ( "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)}}
package mainimport ( "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)}}
package mainimport ( "fmt" "time" "sync")var wg sync.WiatGroupfunc 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()}
package mainimport ( "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()}
package mainimport ( "fmt" "runtime")func main() { // 设置程序占用几个cpu进行执行,默认是全部// 获取计算机cpu个数cpuNum := runtime.NumCPU()fmt.Println(cpuNum) // 6 我本机电脑是6核cpu// 设置占用cpu个数runtime.GOMAXPROCS(2)fmt.Println("ok")}
到此,关于“golang有没有进程”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
--结束END--
本文标题: golang有没有进程
本文链接: https://www.lsjlt.com/news/347479.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0