几个小技巧帮你实现Golang永久阻塞

 更新时间:2021年12月08日 09:56:08   作者:折叠椅  
Go 的运行时的当前设计,假定程序员自己负责检测何时终止一个 goroutine 以及何时终止该程序。有时候我们需要的是使程序阻塞在这一行,本文就来详细的介绍一下,感兴趣的可以了解一下

Go 的运行时的当前设计,假定程序员自己负责检测何时终止一个 goroutine 以及何时终止该程序。可以通过调用 os.Exit 或从 main() 函数的返回来以正常方式终止程序。而有时候我们需要的是使程序阻塞在这一行。

使用 sync.WaitGroup

一直等待直到 WaitGroup 等于 0

package main

import "sync"

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    wg.Wait()
}

空 select

select{}是一个没有任何 case 的 select,它会一直阻塞

package main

func main() {
    select{}
}

死循环

虽然能阻塞,但会 100%占用一个 cpu。不建议使用

package main

func main() {
    for {}
}

用 sync.Mutex

一个已经锁了的锁,再锁一次会一直阻塞,这个不建议使用

package main

import "sync"

func main() {
    var m sync.Mutex
    m.Lock()
}

os.Signal

系统信号量,在 go 里面也是个 channel,在收到特定的消息之前一直阻塞

package main

import (
    "os"
    "syscall"
    "os/signal"
)

func main() {
    sig := make(chan os.Signal, 2)
    signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
    <-sig
}

空 channel 或者 nil channel

channel 会一直阻塞直到收到消息,nil channel 永远阻塞。

package main

func main() {
    c := make(chan struct{})
    <-c
}
package main

func main() {
    var c chan struct{} //nil channel
    <-c
}

总结

注意上面写的的代码大部分不能直接运行,都会 panic,提示“all goroutines are asleep - deadlock!”,因为 go 的 runtime 会检查你所有的 goroutine 都卡住了, 没有一个要执行。你可以在阻塞代码前面加上一个或多个你自己业务逻辑的 goroutine,这样就不会 deadlock 了。

参考

https://pliutau.com/different-ways-to-block-go-runtime-forever/

到此这篇关于几个小技巧帮你实现Golang永久阻塞的文章就介绍到这了,更多相关Golang永久阻塞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • CGO编程基础快速入门

    CGO编程基础快速入门

    这篇文章主要为大家介绍了CGO编程基础快速入门示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言学习之数组的用法详解

    Go语言学习之数组的用法详解

    数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)来访问元素。本文将通过示例详细讲解Go语言中数组的使用,需要的可以参考一下
    2022-04-04
  • Golang使用archive/zip包实现ZIP压缩与解压

    Golang使用archive/zip包实现ZIP压缩与解压

    Golang 中的 archive/zip 包用于处理 ZIP 格式的压缩文件,提供了一系列用于创建、读取和解压缩 ZIP 格式文件的函数和类型,使用起来非常方便,下面就跟随小编一起了解一下具体使用方法吧
    2023-08-08
  • Go语言文件读写操作案例详解

    Go语言文件读写操作案例详解

    这篇文章主要为大家介绍了Go语言文件读写操作案例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Golang中切片长度和容量的区别示例详解

    Golang中切片长度和容量的区别示例详解

    切片长度与容量在Go中很常见,切片长度是切片中可用元素的数量,而切片容量是从切片中第一个元素开始计算的底层数组中的元素数量,这篇文章主要给大家介绍了关于Golang中切片长度和容量区别的相关资料,需要的朋友可以参考下
    2024-01-01
  • Golang 关于Gin框架请求参数的获取方法

    Golang 关于Gin框架请求参数的获取方法

    Gin是Go语言的Web框架,提供路由和中间件支持,本文介绍如何使用Gin获取HTTP请求参数,包括URLPath参数、URLQuery参数、HTTPBody参数和Header参数,详解直接获取和绑定到结构体两种方法,帮助开发者高效处理Web请求
    2024-10-10
  • Go语言普通指针unsafe.Pointer uintpt之间的关系及指针运算

    Go语言普通指针unsafe.Pointer uintpt之间的关系及指针运算

    这篇文章主要为大家介绍了Go语言普通指针unsafe.Pointer uintpt之间的关系及指针运算示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 详解Go 创建命令行工具的方法

    详解Go 创建命令行工具的方法

    这篇文章主要介绍了详解Go 创建命令行工具,需要的朋友可以参考下
    2020-12-12
  • Go获取与设置环境变量的方法详解

    Go获取与设置环境变量的方法详解

    go环境变量的配置其实说真的说难也难,说不难也不难,只要配置成功过一次以后后面都很简单,但是最好是要做好笔记,这篇文章主要给大家介绍了关于Go获取与设置环境变量的相关资料,需要的朋友可以参考下
    2021-11-11
  • Go log库的使用示例详解

    Go log库的使用示例详解

    Go语言内置的log库提供了基本的日志记录功能,支持日志的格式化输出、设置日志前缀、配置输出位置等,可以通过标准logger或创建新的Logger对象来使用,log库简单易用,但功能有限,可能需要配合第三方日志库如logrus、zap等来满足复杂需求
    2024-09-09

最新评论