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

目录
  • 使用 sync.WaitGroup
  • 空 select
  • 死循环
  • 用 sync.Mutex
  • os.Signal
  • 空 channel 或者 nil channel
  • 总结
  • 参考

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永久阻塞内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang将多路复异步io转成阻塞io的方法详解

    前言 本文主要给大家介绍了关于golang 如何将多路复异步io转变成阻塞io的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: package main import ( "net" ) func handleConnection(c net.Conn) { //读写数据 buffer := make([]byte, 1024) c.Read(buffer) c.Write([]byte("Hello from server")) } fu

  • Golang通道的无阻塞读写的方法示例

    无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯一的解决办法,那就是使用select结构. 这篇文章会介绍,哪些情况会存在阻塞,以及如何使用select解决阻塞. 阻塞场景 阻塞场景共4个,有缓存和无缓冲各2个. 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景: 通道中无数据,但执行读通道. 通道中无数据,向通道写数据,但无协程读取. // 场景1 func ReadNoDataFromNoBufCh() {

  • Go语言使用select{}阻塞main函数介绍

    很多时候我们需要让main函数不退出,让它在后台一直执行,例如: func main() { for i := 0; i < 20; i++ { //启动20个协程处理消息队列中的消息 c := consumer.New() go c.Start() } select {} // 阻塞 } 可能大多数人想到阻塞的方法是用channel,当然都是可以的,不过用select{}更加简洁 :) 补充:由浅入深聊聊Golang中select的实现机制 正文 话说今天在玩select的时候发现一个问题,是

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

    目录 使用 sync.WaitGroup 空 select 死循环 用 sync.Mutex os.Signal 空 channel 或者 nil channel 总结 参考 Go 的运行时的当前设计,假定程序员自己负责检测何时终止一个 goroutine 以及何时终止该程序.可以通过调用 os.Exit 或从 main() 函数的返回来以正常方式终止程序.而有时候我们需要的是使程序阻塞在这一行. 使用 sync.WaitGroup 一直等待直到 WaitGroup 等于 0 package m

  • 11个Javascript小技巧帮你提升代码质量(小结)

    本文会不断更新,不足之处欢迎评论区补充. 1. 提炼函数 好处: 避免出现超大函数. 独立出来的函数有助于代码复用. 独立出来的函数更容易被覆写. 独立出来的函数如果拥有一个良好的命名,它本身就起到了注释的作用. 语义化将多段分离的逻辑放在不同的函数中实现,可以使代码逻辑清晰,清楚的看到每一步在做什么. 代码举例: 实现获取数据,然后操作dom显示数据,最后添加事件 函数提炼前 // 逻辑都写在一起,需要将所有逻辑看完才知道这段代码是干嘛的,局部逻辑无法复用 function main() {

  • Golang中使用JSON的一些小技巧分享

    前言 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用. 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了. 参考文章: JSON and struct composition in Go 临时忽略struct字段 type User struct { Email string `json:"email"` Password string `json:"password&qu

  • golang内置函数len的小技巧

    len是很常用的内置函数,可以测量字符串.slice.array.channel以及map的长度/元素个数. 不过你真的了解len吗?也许还有一些你不知道的小知识. 我们来看一道GO101的题目,这题也被GO语言爱好者周刊转载: package main import "fmt" func main() { var x *struct { s [][32]byte } fmt.Println(len(x.s[99])) } 题目问你这段代码的运行结果,选项有编译错误.panic.32和

  • WEB前端开发都应知道的jquery小技巧及jquery三个简写

    一个简单技巧的集合,帮你提升 jQuery 技能.目前小编给大家整理了14个jquery小技巧. 目录结构 1回到顶部按钮 2预加载图片 3检查图片是否加载完毕 4自动修复损坏的图片 5Hover 上的 Class 开关 6禁用 input 字段 7停止链接加载 8淡入淡出/滑动开关 9简单的折叠效果 10将两个 Div 设为相同高度 11在新窗口打开外部链接 12找到文本元素 13切换可视与隐藏的触发器 下面给大家介绍每个小技巧的具体含义. 1.回到顶部按钮 通过使用 jQuery 中的 an

  • JavaScript实用代码小技巧

    在上次的 "Chrome DevTools 你可能不知道的小技巧" 文中,得到很多开发朋友的反馈确实不知道这些小技巧.今天,我们来聊一聊在 EcmaScript5/6+ 中的一些小技巧,欢迎评论区讨论下更多技巧. JSON.stringify 我们平时经常会用到JSON 对象,比如当我们要实现对象的深拷贝时,我们可以用JSON 对象的JSON.stringify和JSON.parse 来拷贝一个完全一样的对象,而不会对原对象产生任何引用关系.在使用localStorage 时,也会用到

  • 让你5分钟掌握9个JavaScript小技巧

    译者按: 技巧虽好.重在掌握并使用起来! 原文: Learn these neat JavaScript tricks in less than 5 minutes 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 1. 删除数组尾部元素 一个简单的用来清空或则删除数组尾部元素的简单方法就是改变数组的length属性值. const arr = [11, 22, 33, 44, 55, 66]; // truncanting arr.l

  • Vue项目中最新用到的一些实用小技巧

    写在前面 在最近的 Vue 项目中,为了完成需求使用了一些小技巧,做个笔记,或许也能帮到道友. 阅读重点 需求一:为路径配置别名 在开发过程中,我们经常需要引入各种文件,如图片.CSS.JS等,为了避免写很长的相对路径(../),我们可以为不同的目录配置一个别名. 找到 webpack.base.config.js 中的 resolve 配置项,在其 alias 中增加别名,如下: 创建一个 CSS 文件,随便写点样式: .avatar display: flex; justify-conten

  • 11个Python Pandas小技巧让你的工作更高效(附代码实例)

    本文为你介绍Pandas隐藏的炫酷小技巧,我相信这些会对你有所帮助. 或许本文中的某些命令你早已知晓,只是没意识到它还有这种打开方式. Pandas是一个在Python中广泛应用的数据分析包.市面上有很多关于Pandas的经典教程,但本文介绍几个隐藏的炫酷小技巧,我相信这些会对你有所帮助. 1. read_csv 这是读取数据的入门级命令.当要你所读取的数据量特别大时,试着加上这个参数nrows = 5,就可以在载入全部数据前先读取一小部分数据.如此一来,就可以避免选错分隔符这样的错误啦(数据不

  • 9个JavaScript日常开发小技巧

    1.生成指定范围的数字 在某些情况下,我们会创建一个处在两个数之间的数组.假设我们要判断某人的生日是否在某个范围的年份内,那么下面是实现它的一个很简单的方法 let start = 1900, end = 2000; [...new Array(end + 1).keys()].slice(start); // [ 1900, 1901, ..., 2000] // 还有这种方式,但对于很的范围就不太稳定 Array.from({ length: end - start + 1 }, (_, i

随机推荐