Golang无限开启Goroutine?该如何限定Goroutine数量?
如果不控制Goroutine的数量会出什么问题?首先我们都知道Goroutine具备以下两个特点:体积轻量(占内存小,一个2kb左右)优秀的GMP调度(详见:图解Golang的GMP原理与调度流程)那么goroutine是否真的可以无限制的开启呢?如果做一个服务器或者一些高业务的场景,能否随意的开启goroutine并且没有控制控制其生命周期呢?让这些goroutine自生自灭,相信大都数人都会这么想:毕竟有强大的GC和优秀的调度算法支撑,应该可以无限的开启吧。我们先看下面一个例子:demo1.gopackagemainimport("fmt""math""runtime")funcmain(){//模拟用户需求业务的数量task_cnt:=math.MaxInt64fori:=0;i 是的。在Go语言中,goroutine是轻量级的执行线程,可以并行执行。在启动Gin服务的同时,可以创建一个goroutine来启动外部的exe服务。两个操作可以同时进行,提高程序的效率。通过goroutine的并发执行,可以实现同时启动Gin和exe服务的需求。 启动你的Golang项目,避免反复配置的困扰,理解并掌握GOROOT、GOPATH、src、pkg和bin这几个关键目录至关重要。首先,一个基本的项目结构包括src目录存放源代码,bin存放编译后的可执行文件,而pkg则存放编译后的包文件。bin和pkg通常由go命令自动生成,你只需创建src来存放项目代码。创建一个简单的项目,例如命名为main,包含main.go文件。内容如下:创建好项目后,接下来就是在Goland中配置。你需要设置GOROOT,指向你的Go安装路径,这类似Java的JAVA_HOME。同时,配置GOPATH,指定你的项目源代码的根目录。Goland中,有两种GOPATH配置:Project GOPATH针对每个项目独立,Global GOPATH则适用于共享第三方包。在ToolBar的配置中,选择运行文件时,指定main.go所在的文件夹,输出文件夹为src的同级bin目录,工作目录即设置的GOPATH 最近线上有个服务突然卡死了,看起来是进程启动了,但是请求接口则反应连接不上,看错误日志也没有什么异常信息,对于这种线上服务卡死的问题,一直没有丰富经验来排查。我先是用 strace -p pid 来看问题,发现有时候又处于wait futex,有时候有正常的刷刷刷一大堆信息。按照我之前的经验,出现wait futex,一般是等待channel出现,如果一直处于wait futex,则说明进程卡死在某个channel上了。但是现在这个卡死的进程并没有一直处于wait futex,说明可能不是卡死在某个channel上,至少还有其他goroutine在正常活动中。进程没有卡死在wait futex,但是又不能监听端口处理请求,说明要么是在启动阶段,还未到监听端口这一步就出现死锁卡死了,要么就是监听端口的那部分代码出问题了。以前我只用过strace -p 来判断是否死锁了,更早之前还试过用gdb调试python服务,但是go的服务,该用什么工具,还不太了解,理论上用strace和gdb也能排查到一些问题的,但是这两个工具都无法识别goroutine,调试起来很难 检查终端是否为zsh,M1版的Mac 默认使用Zsh作为shell,请查看并自行设置及安装。下载并安装iTerm2,将压缩包解压后将app拖入应用程序完成安装。首次打开iTerm2 可能会提示,请点击安装。安装oh-my-zsh,通过它为终端添加实用功能。在安装前需先安装Homebrew和Wget。进入Homebrew官网安装提示安装即可,使用命令安装wget。安装完成后进入oh-my-zsh官网安装。安装命令补全和命令高亮插件,下载插件,配置.zshrc 文件并保存修改,重载配置使插件生效。访问Visual Studio Code官网下载Apple Silicon版本,解压后将app拖入应用程序安装。安装完成后,若首次运行会提示是否安装中文插件,点击安装或使用快捷键【Cmd+Shift+P】调出搜索框搜索【configure language】选择中文包进行下载安装。下载Golang程序,选择applegolang启动gin的时候,启动一个exe服务
让你的Golang项目在IDE里跑起来(Goland使用入门-GOROOT、GOPATH、src、 pkg、bin、import)
使用dlv排查Golang程序线上问题的过程及使用记录
M1版Mac从零开始搭建Golang开发环境