一文带你搞懂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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows环境下vscode-go安装笔记(不支持32位)

    Windows环境下vscode-go安装笔记(不支持32位)

    这篇文章主要介绍了Windows环境下vscode-go安装笔记(不支持32位),需要的朋友可以参考下
    2017-02-02
  • golang validator库参数校验实用技巧干货

    golang validator库参数校验实用技巧干货

    这篇文章主要为大家介绍了validator库参数校验实用技巧干货,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go 语言选择器实例教程

    Go 语言选择器实例教程

    这篇文章主要为大家介绍了Go 语言选择器实例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • golang gorm开发架构及写插件示例

    golang gorm开发架构及写插件示例

    这篇文章主要为大家介绍了golang gorm开发架构及写插件的详细示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • go语言定义零值可用的类型学习教程

    go语言定义零值可用的类型学习教程

    这篇文章主要为大家介绍了go语言定义零值可用的类型教程学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Go语言中的if条件语句使用详解

    Go语言中的if条件语句使用详解

    这篇文章主要介绍了Go语言中的if条件语句的使用,包括if...else语句以及相关嵌套,需要的朋友可以参考下
    2015-10-10
  • GO开发编辑器安装图文详解

    GO开发编辑器安装图文详解

    这篇文章主要介绍了GO开发编辑器安装,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Go语言Http Server框架实现一个简单的httpServer

    Go语言Http Server框架实现一个简单的httpServer

    这篇文章主要为大家介绍了Go语言Http Server框架实现一个简单的httpServer抽象,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Hugo Config模块构建实现源码剖析

    Hugo Config模块构建实现源码剖析

    这篇文章主要为大家介绍了Hugo Config模块构建实现源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Go实现文件分片上传

    Go实现文件分片上传

    这篇文章主要为大家详细介绍了Go实现文件分片上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论