go中的协程Goroutine

文章目录

Goroutine

概述

​ goroutine是Go语言并行设计的核心,有人称之为go程。 Goroutine从量级上看很像协程,它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。

一般情况下,一个普通计算机跑几十个线程就有点负载过大了,但是同样的机器却可以轻松地让成百上千个goroutine进行资源竞争。

创建Goroutine

  • 只需在函数调⽤语句前添加 go 关键字,就可创建并发执⾏单元。开发⼈员无需了解任何执⾏细节,调度器会自动将其安排到合适的系统线程上执行。
go 复制代码
package main

import (
"fmt"
"time"
"runtime"
)



fucn Test_Goroutine(){
    i := 1;
    for	{
        if(i == 10){
            //退出协程
            runtime.Goexit();
        }
		i++;
        fmt.Println(i);
        //休眠1s
        time.Sleep(time.Second *1);
    }
}

func main(){
    //启动协程
    go Test_Goroutine()
    
    //go中的死循环
    for{}
}

Goroutine特性

  • **主goroutine退出后,其它的工作goroutine也会自动退出:**主协程退出后,其他协程会立即退出
    • 开发中,我们需要将主协程设计为阻塞保证其他协程能够正常执行任务

Goexit函数

  • goexit函数会立即终止当前goroutine的执行
    • goexit会击穿,retuin 不会
  • goexit和retuin的区别
    • 都可以结束函数,但是goexit具有击穿特性
    • retuin执行之后只能执行当前函数的defer
    • goexit执行后能保证所有注册过defer都会被执行
  • os.Exit 函数是终止主协程的,调用os.Exit函数会结束整个程序
go 复制代码
func MyPrint(){
      defer fmt.Println("8888")
    for{
        fmt.Println("1111")
        time.Sleep(time.second *1)
    }
}

fucn Test_Goroutine(){
    defer fmt.Println("6666")
    i := 1;
    for	{
        if(i == 10){
            //退出协程
            runtime.Goexit(); //goexit退出后能输出所有注册过defer
            //return  return 退出后只能输出当前函数的defer
        }
		i++;
        fmt.Println(i);
        //休眠1s
        time.Sleep(time.Second *1);
    }
}

func main(){
    //启动协程
    go Test_Goroutine()
    
    //go中的死循环
    for{}
}

总结

  • goroutine 是go并发的基础
  • goroutine从轻量级看,它比线程更小
  • 主goroutine退出后,其它的工作goroutine也会自动退出
  • 函数调⽤语句前添加 go 关键字,就可以创建协程
  • 主协程退出后,其他协程会立即退出
相关推荐
灯澜忆梦11 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-11 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-11 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白12 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
段一凡-华北理工大学14 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe14 小时前
C++——多态
开发语言·c++
心平气和量大福大15 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_16 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸16 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地17 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis