一文带你搞懂Golang如何正确退出Goroutine

 更新时间:2023年06月18日 10:45:43   作者:humblelei  
在Go语言中,Goroutine是一种轻量级线程,它的退出机制对于并发编程至关重要,下午就来介绍几种Goroutine的退出机制,希望对大家有所帮助

在Go语言中,Goroutine是一种轻量级线程,它的退出机制对于并发编程至关重要。本文将介绍几种Goroutine的退出机制,并提供了一些示例代码来说明每种机制的使用。

函数或方法执行完毕

最常见的Goroutine退出方式是函数或方法执行完毕。当Goroutine中的函数或方法执行完毕时,该Goroutine会自动退出。

示例:

package main
import (
	"fmt"
	"time"
)
func main() {
	go func() {
		// Goroutine 中的函数执行完毕后自动退出
		fmt.Println("Goroutine execution complete")
	}()
	// 主 Goroutine 继续执行其他任务
	time.Sleep(time.Second)
	fmt.Println("Main Goroutine execution complete")
}

在上面的示例中,我们创建了一个匿名的Goroutine,在其中打印一条消息,然后Goroutine执行完毕并自动退出。主Goroutine继续执行其他任务。

返回语句

在Goroutine中,我们可以使用return语句显式地退出。当执行到return语句时,该Goroutine将会终止并返回相应的结果(如果有)。

示例:

package main
import (
	"fmt"
	"time"
)
func main() {
	go func() {
		// Goroutine 中使用 return 语句显式退出
		fmt.Println("Goroutine execution")
		return
	}()
	// 主 Goroutine 继续执行其他任务
	time.Sleep(time.Second)
	fmt.Println("Main Goroutine execution complete")
}

在上面的示例中,我们创建了一个匿名的Goroutine,并在其中打印一条消息,然后使用return语句显式地退出Goroutine。

runtime.Goexit() 函数

runtime.Goexit()函数可以用于直接终止当前Goroutine的执行,而不影响其他Goroutine。调用runtime.Goexit()会立即停止当前Goroutine的执行,但不会导致程序退出。

示例:

package main
import (
	"fmt"
	"runtime"
	"time"
)
func main() {
	go func() {
		// 使用 runtime.Goexit() 终止当前 Goroutine 的执行
		fmt.Println("Goroutine execution before Goexit")
		runtime.Goexit()
		fmt.Println("Goroutine execution after Goexit") // 不会执行到这里
	}()
	// 主 Goroutine 继续执行其他任务
	time.Sleep(time.Second)
	fmt.Println("Main Goroutine execution complete")
}

在上面的示例中,我们创建了一个匿名的Goroutine,并在其中使用runtime.Goexit()函数终止Goroutine的执行。

panic() 和 recover()

如果在Goroutine中发生了恐慌(panic),默认情况下会终止当前Goroutine的执行,并向上传播到调用栈的上层。我们可以在Goroutine中使用recover()函数来捕获并处理恐慌,以避免程序崩溃。

示例:

package main
import (
	"fmt"
	"time"
)
func main() {
	go func() {
		defer func() {
			if err := recover(); err != nil {
				// 在 Goroutine 中捕获并处理恐慌
				fmt.Println("Recovered from panic:", err)
			}
		}()
		// 引发恐慌
		panic("Goroutine panic")
	}()
	// 主 Goroutine 继续执行其他任务
	time.Sleep(time.Second)
	fmt.Println("Main Goroutine execution complete")
}

在上面的示例中,我们创建了一个匿名的Goroutine,在其中使用panic()引发恐慌。然后使用defer和recover()捕获并处理恐慌,确保程序不会崩溃。

context.Context 的取消

Go语言的context包提供了一种机制来管理Goroutine的生命周期,包括取消正在运行的Goroutine。我们可以使用context.Context的cancel()方法来取消Goroutine的执行。一旦Goroutine接收到取消信号,它应该尽快退出。

示例:

package main
import (
	"context"
	"fmt"
	"time"
)
func worker(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			// 接收到取消信号后退出 Goroutine
			fmt.Println("Goroutine execution canceled")
			return
		default:
			// 执行正常任务
			fmt.Println("Goroutine executing...")
			time.Sleep(time.Second)
		}
	}
}
func main() {
	ctx, cancel := context.WithCancel(context.Background())
	go worker(ctx)
	// 模拟取消任务
	time.Sleep(3 * time.Second)
	cancel()
	// 主 Goroutine 继续执行其他任务
	time.Sleep(time.Second)
	fmt.Println("Main Goroutine execution complete")
}

在上面的示例中,我们创建了一个worker函数,在其中使用select和ctx.Done()判断是否接收到取消信号。当取消信号到达时,Goroutine会及时退出。

这篇博客详细介绍了Goroutine的退出机制,包括函数或方法执行完毕、返回语句、runtime.Goexit()函数、panic()和recover()、以及context.Context的取消机制。了解和熟练应用这些退出机制对于编写可靠的并发代码至关重要。

到此这篇关于一文带你搞懂Golang如何正确退出Goroutine的文章就介绍到这了,更多相关Go正确退出Goroutine内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GoLang中panic与recover函数以及defer语句超详细讲解

    GoLang中panic与recover函数以及defer语句超详细讲解

    这篇文章主要介绍了GoLang的panic、recover函数,以及defer语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Go语言基础语法和基本数据类型知识巩固

    Go语言基础语法和基本数据类型知识巩固

    这篇文章主要为大家介绍了Go语言基础语法和基本数据类型知识巩固,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Golang实现优雅的将struct转换为map

    Golang实现优雅的将struct转换为map

    在项目实践中,有时候我们需要将struct结构体转为map映射表,然后基于map做数据裁剪或操作。那么下面我来介绍下常用的两种转换方式,希望对大家有所帮助
    2023-01-01
  • Go Java算法之二叉树的所有路径示例详解

    Go Java算法之二叉树的所有路径示例详解

    这篇文章主要为大家介绍了Go Java算法之二叉树的所有路径示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • go语言心跳超时的实现示例

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

    本文主要介绍了go语言心跳超时的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • go语言中time包的各种函数总结

    go语言中time包的各种函数总结

    时间和日期是我们编程中经常会用到的,下面这篇文章主要给大家介绍了关于go语言中time包的各种函数总结的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • gtoken替换jwt实现sso登录的排雷避坑

    gtoken替换jwt实现sso登录的排雷避坑

    这篇文章主要为大家介绍了gtoken替换jwt实现sso登录的排雷避坑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang工作池的使用实例讲解

    Golang工作池的使用实例讲解

    我们使用Go语言开发项目,常常会使用到goroutine;goroutine太多会造成系统占用过高或其他系统异常,我们可以将goroutine控制指定数量,且减少goroutine的创建,这就运用到Go工作池,下面就介绍和使用一下
    2023-02-02
  • 利用GoLang Fiber进行高性能Web开发实例详解

    利用GoLang Fiber进行高性能Web开发实例详解

    这篇文章主要为大家介绍了利用GoLang Fiber进行高性能Web开发实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言七篇入门教程七GC垃圾回收三色标记

    Go语言七篇入门教程七GC垃圾回收三色标记

    这篇文章主要为大家介绍了Go语言教程关于GC垃圾回收三色标记的示例详解,本篇文章是Go语言七篇入门教程系列文章,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11

最新评论