【Golang】Demo
并发控制
package main
// demo 参考地址https://studygolang.com/articles/25950
import (
"github.com/siddontang/go-log/log"
"math/rand"
"sync"
"time"
)
func task() int {
//取[n,m]的数 语法入下:
rand.Seed(time.Now().UnixNano())
//num := rand.Intn(m-n+1) + n
num := rand.Intn(5-1+1) + 1
return num
}
// WaitGroup 一个异步结构体
type WaitGroup struct {
workChan chan int
wg sync.WaitGroup
}
// NewPool 生成一个工作池, coreNum 限制
func NewPool(coreNum int) *WaitGroup {
ch := make(chan int, coreNum)
return &WaitGroup{
workChan: ch,
wg: sync.WaitGroup{},
}
}
// Add 添加
func (ap *WaitGroup) Add(num int) {
// 不向channel里面写大量数据,channel中传递的都是数据的拷贝,可能会影响性能
// channel只控制并发的数量
ap.workChan <- num
ap.wg.Add(1)
}
// Done 完结
func (ap *WaitGroup) Done() {
select {
case <-ap.workChan:
ap.wg.Done()
}
}
// Wait 等待
func (ap *WaitGroup) Wait() {
ap.wg.Wait()
}
func testFunc(i int, wg *WaitGroup) {
defer wg.Done()
t := task()
log.Infof("Index %d, duration %d, begin!", i, t)
time.Sleep(time.Duration(t) * time.Second)
log.Infof("Index %d, duration %d, finish!", i, t)
}
func main() {
work := NewPool(4)
for i := 0; i < 20; i++ {
work.Add(1)
go testFunc(i, work)
}
log.Info("waiting...")
work.Wait()
log.Info("done")
}
安全退出
func stopSignal(pid int, r *sql.Db) {
sigs := make(chan os.Signal, 1)
log.Errorf("register signal notify, pid: %d", pid)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
for {
s := <-sigs
log.Error("recv signal: ", s)
switch s {
case syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
// close kafka
r.Close()
log.Errorf("pid: %d exit", pid)
os.Exit(0)
}
}
}
func main() {
stopSignal(os.Getpid(), r)
}
【Golang】Demo的更多相关文章
- 【Golang】基于录制,自动生成go test接口自动化用例
背景 之前写过一篇博客,介绍怎么用Python通过解析抓包数据,完成自动化用例的编写.最近这段时间在使用go test,所以就在想能不能也使用代码来生成自动化用例,快速提升测试用例覆盖率.说干就干. ...
- 【GoLang】golang 最佳实践汇总
最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...
- 【GoLang】golang 的精髓--流水线,对现实世界的完美模拟
直接上代码: package main import ( "fmt" "runtime" "strconv" "sync" ...
- 【GoLang】golang 中 defer 参数的蹊跷
参考资料: http://studygolang.com/articles/7994--Defer函数调用参数的求值 golang的闭包和普通函数调用区别:http://studygolang.com ...
- 【GoLang】golang context channel 详解
代码示例: package main import ( "fmt" "time" "golang.org/x/net/context" ) ...
- 【GoLang】golang HTTP GET/POST JSON的服务端、客户端示例,包含序列化、反序列化
服务端代码示例: package main import ( "encoding/json" "fmt" "io/ioutil" " ...
- 【GoLang】golang 交叉编译 实现&工具
apt-get install gcc-mingw-w64 env CGO_ENABLED= GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc g ...
- 【GoLang】golang底层数据类型实现原理
虽然golang是用C实现的,并且被称为下一代的C语言,但是golang跟C的差别还是很大的.它定义了一套很丰富的数据类型及数据结构,这些类型和结构或者是直接映射为C的数据类型,或者是用C struc ...
- 【GoLang】golang垃圾回收 & 性能调优
golang垃圾回收 & 性能调优 参考资料: 如何监控 golang 程序的垃圾回收_Go语言_第七城市 golang的垃圾回收(GC)机制 - 两只羊的博客 - 博客频道 - CSDN.N ...
- 【GoLang】go 微服务框架 && Web框架学习资料
参考资料: 通过beego快速创建一个Restful风格API项目及API文档自动化: http://www.cnblogs.com/huligong1234/p/4707282.html Go 语 ...
随机推荐
- background-repeat属性(背景平铺)
background-repeat属性(背景平铺) 默认情况下,如果一幅背景图像不足以占满整个容器时,就会在水平方向和垂直方向重复,以填满整个容器.然而,有时候却希望背景图像只出现一次,或只在某个方向 ...
- MySQL同步部分库注意的问题
同步部分库或部分库表 复制部分库:replicate_do_db 复制排除部分库:replicate_ignore_db 复制部分表:replicate_do_table 复制排除部分表:replic ...
- MySQL日常工具的安装
安装PT工具 #安装依赖 yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-M ...
- SSH 秘钥登入
1.打开权限 vim /etc/ssh/sshd_config 去掉 PubkeyAuthentication yes 一行的# 2.重启ssh服务 systemctl restart ss ...
- CentOS网络服务操作命令
CentOS 重启网络服务,输入下面的命令:systemctl retart network.service 或 systemctl restart network.CentOS 启动网络服务,输入下 ...
- golang 解决 socket: too many open files, 以及 too many open files
同事写的一段代,码业务场景:需要多次GET请求一个三方服务的http 接口,获取数据后写入文件.发现有部分文件没有写入.查看日志出现了报错"socket: too many open fil ...
- Ubuntu20.04 TLS 开机卡在“A start job is running for wait for network to be Configured”解决
问题: 安装ubuntu20.04 TLS系统后,开机卡在"A start job is running for wait for network to be Configured" ...
- ssh 解决远程桌面端口问题
昨天做好今天编辑 先上图 后编辑 需求:因操作失误光猫nat只剩一个可访问命令行的7000端口 前提:7000端口映射内网的22端口,可以登录ssh 解决思路:先vnc安装, gui界面安装 , 然 ...
- Windows使用cmd命令查看当前用户名
https://blog.csdn.net/qq_46068659/article/details/106037024 查看用户: net user 查看当前用户: whoami
- flutter RaisedButton 设置最小宽度和高度
flutter中可以通过ButtonTheme为RaisedButton设置最小宽度,示例代码如下: ButtonTheme( minWidth: 200.0,//设置最小宽度 height: 100 ...