iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang有进程吗
  • 189
分享到

golang有进程吗

go语言Golang进程 2023-05-14 19:05:58 189人浏览 薄情痞子
摘要

golang有进程。进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位;进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。Go语言支持多进程,它线程模型是MPG模型,

golang有进程。进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位;进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。Go语言支持多进程,它线程模型是MPG模型,整体上Go程与内核线程是多对多对应的。

golang有进程吗

教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

一、关于进程和线程

1. 进程(Process)

进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始态、执行态、等待状态、就绪状态、终止状态。

通俗讲:进程就是一个正在执行的程序。

2. 线程

线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。

通俗讲:一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。

1.png

2.png

二、关于并发和并行

1. 并发

多个线程同时竞争一个位置,竞争到的才可以执行,每一个时间段只有一个线程在执行。

3.png

2. 并行

多个线程可以同时执行,每一个时间段,可以有多个线程同时执行。

4.png

3. 通俗讲

多线程程序在单核cpu上运行就是并发,在多核cpu上运行就是并行。如果线程数大于cpu核数,则多线程程序在多个cpu上既有并发也有并行。

三、goroutine协程以及主线程

1. 主线程

可以理解为线程或进程,在一个golang程序的主线程上可以启用多个协程。golang中多协程可以实现并发或者并行。

2. 协程

可以理解为用户级别的线程,这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的。golang的一大特色就是从语言方面原生支持协程,在函数或方法前面加一个go关键词就可以创建一个协程。可以说golang中的协程就是goroutine。

5.png

Golang 中的多协程有点类似其他语言中的多线程。

3. 多协程和多线程

Golang 中每个 goroutine (协程) 默认占用内存远比 Java 、C 的线程少。 OS 线程(操作系统线程)一般都有固定的栈内存(通常为 2MB 左右),一个 goroutine (协程) 占用内存非常小,只有 2KB 左右,多协程 goroutine 切换调度开销方面远比线程要少。 这也是为什么越来越多的大公司使用 Golang 的原因之一。

四、go关键词实操

1. 顺序执行

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)
	}
	
}

2. 加入go

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)
	}
	
}

3. 加入时间

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)
	}
	
}

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)
	}
	
}

5. sync.WaitGroup解决不等待

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()
	
}

6. 多协程并发并行执行

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()
	
}

五、设置golang运行时占用的cpu核数量(不是很重要)

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有进程吗的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: golang有进程吗

本文链接: https://www.lsjlt.com/news/203455.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang有进程吗
    golang有进程。进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位;进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。go语言支持多进程,它线程模型是MPG模型,...
    99+
    2023-05-14
    go语言 Golang 进程
  • golang是多进程吗
    golang是多进程,其线程模型是MPG模型,整体上Go程与内核线程是多对多对应的,因此首先来讲就一定是多线程的。Golang有些所谓的M比N模型,M个线程下可以创建N个go routine,一般而言N远大于M,本质上属于多线程模型,但是协...
    99+
    2023-07-10
  • golang有没有进程
    这篇文章主要介绍“golang有没有进程”,在日常操作中,相信很多人在golang有没有进程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang有没有进程”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • golang有in吗
    本文小编为大家详细介绍“golang有in吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang有in吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。golang没有in。golang中即没有提供类似Py...
    99+
    2023-07-05
  • golang有vm吗
    标题:golang有vm吗?解析golang的虚拟机实现原理摘要:Golang是一种新兴的编程语言,拥有强大的并发和内存管理能力,因此受到越来越多的开发者的青睐。在golang的世界中,是否也有虚拟机(VM)的存在呢?本文将从golang的...
    99+
    2023-05-15
  • golang 有类吗
    Golang是一门以C语言为基础的编程语言,也被称为Go语言。与其他一些编程语言不同,Golang的设计目标是在增强程序员生产力的同时,提供更高的安全性和并发性能。它的设计思路主要体现在简洁易懂的语法、强大的标准库和高效的并发机制上。那么,...
    99+
    2023-05-14
  • golang能读二进制吗
    golang可以读二进制,在Golang中,可以使用各种方法和技术来读取和处理二进制数据,读二进制的方法:1、使用os包中的Open函数打开了一个名为"data.bin"的二进制文件;2、使用binary包中的Read函...
    99+
    2023-07-24
  • golang怎么查看所有进程
    在Golang中,可以使用os包来获取和操作进程相关的信息。要查看所有进程,可以使用os.Process的AllProcesses(...
    99+
    2023-10-21
    golang
  • golang有缓存吗
    Golang是一种开源的编程语言,支持并发和并行编程,在处理高并发请求时非常出色。就像其他编程语言一样,Golang也有着自己的缓存机制来提升程序的性能和响应速度。那么,究竟Golang有缓存吗?本文将为您解答这个问题。Golang语言本身...
    99+
    2023-05-15
  • golang中有类吗
    这篇文章主要介绍“golang中有类吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang中有类吗”文章能帮助大家解决问题。golang中没有类。golang不是一门纯面向对象编程语言,它没有...
    99+
    2023-07-04
  • golang关闭进程
    在Go语言中,关闭进程可以通过os包里的函数来实现。os包提供了一个函数用于向操作系统发送一个关闭信号,以请求关闭进程。例如:package main import ( "fmt" "os&q...
    99+
    2023-05-21
  • golang 进程被删
    近年来,golang以其高效稳定的特性,在软件开发领域得到了越来越广泛的应用。然而,在使用golang编写的程序中,有时会遇到进程被意外删除的问题。本文将深入探讨这个问题的原因及解决方案。一、进程被删的原因1.垃圾回收golang的垃圾回收...
    99+
    2023-05-21
  • golang有工厂类吗
    这篇文章主要介绍“golang有工厂类吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang有工厂类吗”文章能帮助大家解决问题。golang没有有工厂类,因为golang不支持类(class)...
    99+
    2023-07-04
  • golang有抽象类吗
    今天小编给大家分享一下golang有抽象类吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。golang没有抽象类。golan...
    99+
    2023-07-04
  • golang有迭代器吗
    golang有迭代器,其提供了多种类型的迭代器,可以用于遍历数组、切片、映射和通道等数据结构,通过使用迭代器,可以简化代码并提高代码的可读性,无论是遍历数组和切片,还是遍历映射和通道,迭代器都是一种非常有用的工具,在编写golang代码时,...
    99+
    2023-07-17
  • golang有宏概念吗
    golang没有直接支持宏的概念,但提供了一些替代宏的功能和特性,以帮助开发者更加灵活地使用和重用代码。使用Go语言的“text/template”库和“go generate”命令,可以在开发过程中自动生成一些代码,这种方式类似于宏的思想...
    99+
    2023-07-25
  • golang有拦截器吗
    golang没有提供内置的拦截器,但可以利用函数、接口和结构体等语言特性来实现类似的功能,以下是常用拦截器实现方式:1、函数式拦截器,通过在请求到达处理程序之前及其之后调用函数来实现拦截器;2、接口式拦截器,通过定义一个接口,并在目标处理程...
    99+
    2023-07-18
  • golang要协程池吗
    golang不需要协程池。具体原因:1、Golang的协程是非常轻量级的,其创建和销毁的成本非常低;2、Golang的通道机制提供了安全、高效的任务传递方式,可以限制并发任务的数量,使得不需要额外的协程池来管理并发;3、Golang运行时包...
    99+
    2023-07-18
  • golang改名有必要吗
    随着计算机科学的不断发展,编程语言的种类也不断扩展和变化。每一种编程语言都有自己的特点,而golang(原名为Go)也不例外。Golang是由Google开源的一种静态强类型的编程语言,于2009年首次发布,其诞生的使命是解决开发大规模网络...
    99+
    2023-05-14
  • golang拦截器有用吗
    golang拦截器有用,其用途:1、身份验证和权限控制,拦截器可以用于处理用户身份验证和权限控制;2、日志记录,拦截器可以用于记录请求和响应的详细信息;3、缓存,拦截器可以用于缓存数据,以提高应用程序的性能和响应速度;4、错误处理,拦截器可...
    99+
    2023-07-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作