首页 > 其他分享 >用Golang做一个永久阻塞,有哪些小技巧 ?

用Golang做一个永久阻塞,有哪些小技巧 ?

时间:2024-05-06 09:04:03浏览次数:28  
标签:语言 package 阻塞 永久 Golang sync Go main

用Golang做一个永久阻塞,有哪些小技巧 ?

磊丰 Go语言圈 2024-05-06 08:30 广东 听全文 Go语言圈 Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长 159篇原创内容 公众号
学习与交流:Go语言技术微信群

商务合作加微信:LetsFeng

 

现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.


图片

图片

点击获取:Goland 正式版激活码,获取后直接激活即可

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{}
}

》》》》程序员福利《《《《

微店买买,,, Goland正版激活码,获取后直接激活即可 小程序

死循环
虽然能阻塞,但会 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 了。

 


文章首发:

 

 

 

 

 

 

 

 

 

更多相关Go语言的技术文章或视频教程,请关注本公众号获取并查看,感谢你的支持与信任!

 

学Go语言哪些事儿282 学Go语言哪些事儿 · 目录 上一篇Go 语言将 PDF 转为 Word ,代码怎么实现 ? 阅读 30 ​ 喜欢此内容的人还喜欢   一次VMware VCenter故障处理     LINUX开源玩家   不看的原因   带你搞懂 Kubernetes Pod 如何获取 IP 地址     Raymond运维   不看的原因   12 个适合做外包项目的开源后台管理系统     技术老男孩   不看的原因   写留言       Go语言圈            

人划线

标签:语言,package,阻塞,永久,Golang,sync,Go,main
From: https://www.cnblogs.com/cheyunhua/p/18174219

相关文章

  • 为什么我要使得GOLang重写SAAS(软件即服务)服务端
    引言“道”在中国哲学中,是一个重要的概念,表示“终极真理”。“道”这一概念,不单为哲学流派诸子百家所重视,也被宗教流派道教等所使用。大道至简的意思就是大道理是极其简单的,简单到一两句话就能说明白。所谓“真传一句话,假传万卷书”。正文在开启独立创作之路之前,我主要用不用......
  • Golang:go-humanize将文件大小转换成Kb、Mb、Gb适合人类阅读的单位
    Golang:go-humanize将文件大小转换成Kb、Mb、Gb适合人类阅读的单位原创 吃个大西瓜 CodingBigTree 2024-05-0408:30 云南​最近去了昆明的教场中路体验了满屏蓝花楹,感受到了梦幻般的世界,随手拍了一张图,分享给大家,有时间可以去一趟,体验一次,顺便说一下,美女很多喔 ......
  • golang 官方代码 汇总
    go1.22.2-- 序章golang官网的代码汇总,汇总到一起,方便查阅。 注,如有侵权,请通知我处理......
  • golang初学:交叉编译
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 序章golang支持跨平台,支持的方式是在一个平台编译其它平台的可执行程序。本文介绍Windows11(开发主机)上编译Linux(目标主机)上的可执行程序。 #gobuild 开发主机和目标......
  • 【发现一个小问题】golang http client: 配置了Client 对象的 Timeout 就会导致 conte
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯我这样初始化了客户端:varclient=http.Client{Timeout:time.Duration(1000)*time.Millisecond,}然后在request创建过程中使用了context的timeout机制:tim......
  • 转载golang中net/http包用法
    转自:https://studygolang.com/articles/55151.前言http包包含http客户端和服务端的实现,利用Get,Head,Post,以及PostForm实现HTTP或者HTTPS的请求.2.本文分析内容安排函数结构3.函数3.1服务端函数funcHandle(patternstring,handlerHandler)将handler按照指定的......
  • golang将uint32与byte[]互转
    packagemainimport( "encoding/binary" "fmt")funcmain(){ //一个长度为4的byte切片,表示一个负数 bytes:=[]byte{0xFF,0xFF,0xFF,0xFF} //将byte切片转换为int32 num:=int32(binary.BigEndian.Uint32(bytes)) fmt.Printf("Byte切片转换为Int32:%d......
  • golang中的ORM框架
    目录ORM框架GORM基本用法1.安装GORM2.连接数据库3.定义模型4.执行CRUD操作5.迁移和查询ORM框架在Golang中,ORM(Object-RelationalMapping,对象关系映射)框架是一种用于将面向对象的概念与关系型数据库中的表进行映射的工具。通过使用ORM框架,开发者可以更方便地执行数据库操......
  • Golang基于etcd实现服务注册和发现功能
    简单做个笔记registerpackagemainimport( "os" "log" "time" "syscall" "context" "os/signal" "go.etcd.io/etcd/clientv3")//ServiceRegister创建租约注册服务typeServiceRegisterstruct......
  • golang strings.Join的用法
    在Go语言中,strings.Join函数用于将一个字符串切片([]string)连接成一个单独的字符串,并且可以在它们之间插入一个指定的分隔符。这个函数是strings包中的一部分,因此在使用之前需要先导入这个包。以下是strings.Join函数的基本用法:packagemainimport("fmt""stri......