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 关键字,就可以创建协程
  • 主协程退出后,其他协程会立即退出
相关推荐
-今昭-1 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设3 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
_Twink1e3 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心3 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长4 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
FfHUCisI4 小时前
Golang Map 哈希表实现
golang·哈希算法·散列表
源代码•宸4 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
2601_967338714 小时前
C#上位机开发零基础入门到精通全套视频
开发语言·c#
小白学大数据5 小时前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
旧梦95275 小时前
Java SortedMap 接口详解:从入门到实战
java·开发语言