在Golang中各种永远阻塞的姿势

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()

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)

}

空channel或者nil channel

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

package main

func main() {

c := make(chan struct{})

}

package main

func main() {

var c chan struct{} //nil channel

}

总结

注意上面写的的代码大部分不能直接运行,都会panic,提示“all goroutines are asleep - deadlock!”,因为go的runtime会检查你所有的goroutine都卡住了,

没有一个要执行。你可以在阻塞代码前面加上一个或多个你自己业务逻辑的goroutine,这样就不会deadlock了。

参考

go语言os.exit(1)_在Golang中各种永远阻塞的姿势相关推荐

  1. Golang中各种永远阻塞的方法

    在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...

  2. go语言os.exit(1)_Go语言os包用法简述

    os标准包,是一个比较重要的包,顾名思义,主要是在服务器上进行系统的基本操作,如文件操作,目录操作,执行命令,信号与中断,进程,系统状态等等.在os包下,有exec,signal,user三个子包. ...

  3. go语言的iota是什么意思_关于Golang中的iota

    快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...

  4. onclick如何调用含参函数_在 golang 中如何调用私有函数(绑定隐藏的标识符)

    名字在 golang 中的重要性和在其他任何一种语言是一样的.他们甚至含有语义的作用:在一个包的外部某个名字的可见性是由这个名字首字母是否是大写来决定的. 有时为了更好的组织代码或者在其他包使用某些隐 ...

  5. golang 包含 数组_在 Golang 中如何快速判断字符串是否在一个数组中

    在使用 Python 的时候,如果要判断一个字符串是否在另一个包含字符串的列表中,可以使用in 关键词,例如: name_list= ['pm', 'kingname', '青南'] if 'king ...

  6. mysql pmt函数怎么用_在Golang中如何正确地使用database/sql包访问数据库

    本文记录了我在实际工作中关于数据库操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上的东西,所以希望能抛砖引玉,也算是对这个问题的一次总结.其实我也是一个新手,机缘巧合几 ...

  7. golang 函数传多个参数_关于Golang中方法参数的传递

    结构体声明 为了说明函数以及方法调用的过程,这里先定义一个struct,在下面的描述中会使用到它. type Person struct { Name string Age uint16 } 普通函数 ...

  8. go语言os.exit(1)_Go语言-信号os.Interrupt和信号syscall.SIGTERM的应用

    实例 package main import( "fmt" "os" "os/signal" "sync" " ...

  9. exec go 重启_[译]Golang中的优雅重启

    声明:本文目的仅仅作为个人mark,所以在翻译的过程中参杂了自己的思想甚至改变了部分内容,其中有下划线的文字为译者添加.但由于译者水平有限,所写文字或者代码可能会误导读者,如发现文章有问题,请尽快告知 ...

最新文章

  1. 使用Kryo的序列化方式提升Netty性能
  2. 使用LM2576制作数控电源
  3. 【floyd存字典序路径】【HDU1385】【Minimum Transport Cost】
  4. [WCF REST] 通过ASP.NET Output Caching实现声明式缓存
  5. 【drp 11】使用Junit简单测试接口方法
  6. Redhat Mongodb学习笔记
  7. python显示目录中的文件_Python中的文件和目录操作实现
  8. 【数字图像处理】直方图均衡化详解及编程实现
  9. vue 引入html模板,vue单页面用script方式引入 使用模板时报错。 - 社区 - 妙味课堂...
  10. studiolibrary安装_DAZ Studio 3D扩展包安装使用教程
  11. LAMP 3.1 mysql的root密码重置
  12. 计算机网络po3代表的意思,计算机系统与网络技术中常用的单词缩写的意思.pdf...
  13. SQLite查询优化(转)
  14. “2016年度优秀软件工程造价师”“工信部行业标准《软件研发成本度量规范》2016年度应用示范单位” 评选活动正式启动...
  15. 天涯明月刀手游为什么服务器维护,天涯明月刀手游12.7日更新公告 更新内容详情一览...
  16. Python:士兵与枪(类的使用)
  17. for循环中的continue和break
  18. java打印漏斗图案_寒假作业1打印漏斗
  19. Spring Cloud GateWay系列(三):路由规则动态刷新
  20. CentOS7重置密码

热门文章

  1. MVC里面写html获取不到input,asp.net-mvc – ASP.Net [HiddenInput]数据属性在Razor中用Html.EditorForModel渲染时不起作用?...
  2. python弹球小游戏程序_Python实现弹球小游戏
  3. mybatis insert 重复数据2条_Mybatis框架lt;增gt;:添加一条数据到数据库中,insert...
  4. C语言定义外部文件可使用的结构体和结构体变量
  5. 将tensor转array
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 2丨连续出现的数字【难度中等】
  7. Python 中 异步协程 的 使用方法介绍
  8. C++ Programmer's Cookbook C++基础和C++高级
  9. ThoughtWorks洞见领域驱动设计思维导图笔记
  10. Object的方法equals,hashCode,toString,clone。另外Comparable接口的方法