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 关键字,就可以创建协程
  • 主协程退出后,其他协程会立即退出
相关推荐
摇滚侠2 分钟前
JavaWeb 全套教程 Filter 107-111
java·开发语言·servlet
聆风吟º5 分钟前
【C标准库】深入理解C语言 atoi 函数:字符串转换为整数
c语言·开发语言·库函数·atoi
凤山老林5 分钟前
81-Java Scanner 类
java·开发语言
j_xxx404_5 分钟前
MySQL数据库基础硬核解析:从 C/S 网络服务到磁盘文件与存储引擎
linux·运维·服务器·开发语言·数据库·mysql·ai
艾莉丝努力练剑5 分钟前
【QT】系统相关:QT文件
linux·服务器·开发语言·网络·qt·tcp/ip·计算机网络
沐苏瑶8 分钟前
深入浅出 Java 文件操作与 IO:从文件系统到数据流实战
java·开发语言
海鸥-w9 分钟前
用python (fastapi)做项目第二天实现新闻列表和新闻详情接口
开发语言·python·fastapi
Cloud_Shy61810 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第四章 Item 25 - 26)
开发语言·人工智能·经验分享·笔记·python·学习方法
SenChien11 分钟前
Golang入门学习笔记
golang·go
caimouse1 小时前
Reactos 第 4 章 对象管理 — 4.8 系统调用 NtDuplicateObject / 4.9 系统调用 NtClose
开发语言·windows·架构