浅析Golang中的协程(goroutine)

 更新时间:2023年05月22日 09:16:46   作者:周小末天天开心  
在Go语言中,协程(goroutine)是轻量级的线程,它是Go语言中实现并发编程的基础,Go语言中的协程是由Go运行时调度器(scheduler)进行管理和调度的,本文将给大家简单的介绍一下Golang中的协程,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

进程

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

线程

线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。

并发

并发是指在同一时间段内处理多个任务,通过多个任务之间的切换,使得在表面上看来是同时进行的。在 Go 语言中,可以使用 goroutine 和 channel 实现并发编程。

特点:

  • 多个任务作用在一个CPU上面

  • 同一时间点只能有一个任务执行

  • 同一时间段内执行多个任务

并行

并行是指同时处理多个任务,即多个任务同时在不同的处理器上进行执行。并行可以显著提高程序的性能,特别是在多核 CPU 中,能够利用多个 CPU 核心进行计算。在 Go 语言中,可以使用 goroutine 和 runtime 包的 GOMAXPROCS 函数实现并行编程。

特点:

  • 多个任务作用在多个CPU上面

  • 同一时刻执行多个任务

通俗的讲,多线程程序在单核CPU上面运行就是并发,多线程程序在多核CUP上运行就是并行,如果线程数大于CPU核数,则多线程程序在多个CPU上面运行既有并行也有并发。

协程(goroutine)

在 Go 语言中,协程(goroutine)是轻量级的线程,它是 Go 语言中实现并发编程的基础。与传统的线程相比,协程的创建和切换都非常轻量级,可以在单个线程内创建成千上万个协程,且切换开销非常小,因此可以实现高效的并发编程。

Go 语言中的协程是由 Go 运行时调度器(scheduler)进行管理和调度的。当程序启动时,Go 运行时会默认启动一个主协程,主协程会创建其他的子协程,这些协程会被分配到不同的系统线程上进行执行。当某个协程发生阻塞时,Go 运行时会将该协程挂起并让出 CPU,转而执行其他协程,以充分利用系统资源。

在 Go 语言中,创建协程非常简单,只需要在函数调用前加上 go 关键字即可。

例如:

func main() {
    go func() {
        fmt.Println("Hello, world!")
    }()
}

使用sync.WaitGroup等待协程执行完毕

func test1() {
 
    for i := 0; i < 10; i++ {
 
        //每100毫秒输出一次
 
        fmt.Println("test1() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 100)
 
    }
 
    wg.Done() //协程计数器加-1
 
}
 
func main() {
    //注意:
 
    //1.主线程执行完毕后即使协程没有执行完毕程序也会退出
 
    //2.协程可以在主线程没有执行完毕前提前退出,协程是否执行完毕不会影响主线程的执行
 
    //为了保证我们的程序可以顺利执行,我们想让协程执行完毕后再执行主进程退出,
 
    //这个时候我们可以使用sync.WaitGroup等待协程执行完毕
 
    wg.Add(1)  //协程计数器加1
 
    go test1() //表示开启一个协程
 
    for i := 0; i < 10; i++ {
 
        //每50毫秒输出一次
 
        fmt.Println("mian() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 50)
 
    }
 
    wg.Wait() //等待协程执行完毕
 
    fmt.Println("主线程退出。。。")
}

多协程和多线程

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

func test1() {
 
    for i := 0; i < 10; i++ {
 
        //每100毫秒输出一次
 
        fmt.Println("test1() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 100)
 
    }
 
    wg.Done() //协程计数器加-1
 
}
 
func test2() {
 
    for i := 0; i < 10; i++ {
 
        //每100毫秒输出一次
 
        fmt.Println("test2() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 100)
 
    }
 
    wg.Done() //协程计数器加-1
 
}
 
func main() {
    wg.Add(1)  //协程计数器加1
 
    go test1() //表示开启一个协程
 
    wg.Add(1)  //协程计数器加1
 
    go test2() //表示开启一个协程
 
    wg.Wait()
 
    fmt.Println("主程序退出。。。")
}

以上就是浅析Golang中的协程(goroutine)的详细内容,更多关于Golang 协程的资料请关注程序员之家其它相关文章!

相关文章

  • go语言心跳超时的实现示例

    go语言心跳超时的实现示例

    本文主要介绍了go语言心跳超时的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • go语言通过反射获取和设置结构体字段值的方法

    go语言通过反射获取和设置结构体字段值的方法

    这篇文章主要介绍了go语言通过反射获取和设置结构体字段值的方法,实例分析了Go语言反射的使用技巧,需要的朋友可以参考下
    2015-03-03
  • 详解Go语言中make和new的区别

    详解Go语言中make和new的区别

    Go语言中,有两个比较雷同的内置函数,分别是new和make方法,那他们有什么区别呢?本文将通过一些示例为大家详细介绍一下,感兴趣的可以了解一下
    2023-02-02
  • Go语言题解LeetCode1260二维网格迁移示例详解

    Go语言题解LeetCode1260二维网格迁移示例详解

    这篇文章主要为大家介绍了Go语言题解LeetCode1260二维网格迁移示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 图解Golang的GC垃圾回收算法

    图解Golang的GC垃圾回收算法

    这篇文章主要介绍了图解Golang的GC垃圾回收算法,详细的介绍了三种经典的算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Golang内存分配机制详解

    Golang内存分配机制详解

    Go 语言的内存分配机制是理解和优化 Go 程序性能的关键,在 Go 中,内存管理是自动进行的,这得益于 Go 的垃圾回收机制,了解内存如何分配和回收,可以帮助我们写出更高性能的代码,本文将深入讲解下 Go 内存分配机制,需要的朋友可以参考下
    2023-12-12
  • golang编程开发使用sort排序示例详解

    golang编程开发使用sort排序示例详解

    这篇文章主要为大家介绍了go语言编程开发使用sort来排序示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • GO?CountMinSketch计数器(布隆过滤器思想的近似计数器)

    GO?CountMinSketch计数器(布隆过滤器思想的近似计数器)

    这篇文章主要介绍了GO?CountMinSketch计数器(布隆过滤器思想的近似计数器),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • Golang跳转语句continue与goto使用语法详解

    Golang跳转语句continue与goto使用语法详解

    这篇文章主要介绍了Golang跳转语句continue与goto使用语法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • 300行代码实现go语言即时通讯聊天室

    300行代码实现go语言即时通讯聊天室

    本文主要介绍了300行代码实现go语言即时通讯聊天室,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论

?


http://www.vxiaotou.com