golang有没有进程
这篇文章主要介绍“golang有没有进程”,在日常操作中,相信很多人在golang有没有进程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang有没有进程”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
golang有进程。进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位;进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。go语言支持多进程,它线程模型是MPG模型,整体上Go程与内核线程是多对多对应的。
一、关于进程和线程
1. 进程(Process)
进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始态、执行态、等待状态、就绪状态、终止状态。
通俗讲:进程就是一个正在执行的程序。
2. 线程
线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。
通俗讲:一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。
二、关于并发和并行
1. 并发
多个线程同时竞争一个位置,竞争到的才可以执行,每一个时间段只有一个线程在执行。
2. 并行
多个线程可以同时执行,每一个时间段,可以有多个线程同时执行。
3. 通俗讲
多线程程序在单核cpu上运行就是并发,在多核cpu上运行就是并行。如果线程数大于cpu核数,则多线程程序在多个cpu上既有并发也有并行。
三、goroutine协程以及主线程
1. 主线程
可以理解为线程或进程,在一个golang程序的主线程上可以启用多个协程。golang中多协程可以实现并发或者并行。
2. 协程
可以理解为用户级别的线程,这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的。golang的一大特色就是从语言方面原生支持协程,在函数或方法前面加一个go关键词就可以创建一个协程。可以说golang中的协程就是goroutine。
Golang 中的多协程有点类似其他语言中的多线程。
3. 多协程和多线程
Golang 中每个 goroutine (协程) 默认占用内存远比 Java 、C 的线程少。 OS 线程(操作系统线程)一般都有固定的栈内存(通常为 2MB 左右),一个 goroutine (协程) 占用内存非常小,只有 2KB 左右,多协程 goroutine 切换调度开销方面远比线程要少。 这也是为什么越来越多的大公司使用 Golang 的原因之一。
四、go关键词实操
1. 顺序执行
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)}}
2. 加入go
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)}}
3. 加入时间
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)}}
4. 主线程执行快的情况
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)}}
5. sync.WaitGroup解决不等待
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()}
6. 多协程并发并行执行
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()}
五、设置golang运行时占用的cpu核数量(不是很重要)
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有没有进程”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341