【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 语 ...
随机推荐
- Window/linux(docker) 单台宿主机部署多个Jenkins节点
Window/linux(docker) 单台宿主机部署多个Jenkins节点 在使用Jenkins过程中,增加了手动输入的步骤,会阻塞节点运行任务: 由于资源有限,需要在一台机器挂载了很多Jenki ...
- 【SQL Server】列名首字母大写
使用UPPER 和 LOWWER函数组合首字母大写.例如: 1 SELECT user_id,(UPPER(LEFT(name,1) ) + RIGHT(name , LEN(name) -1) )A ...
- 整合mybatis实现简单的增删改查
mybatis配置相关代码 配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...
- mac 查看,终止进程
找到其他 活动监视器 在这里可以查看和cpu占用 杀死有问题的过程: 1.它占用了大量CPU周期或内存, 2.在"活动监视器"中被突出显示为已崩溃, 先单击该过程,点击x可以终止进 ...
- 【2020NOI.AC省选模拟#7】A. t1
题目链接 原题解: 由于$+$满足幂等性,我们可以设$f_{i,j}$为从$i$号点向根$2^j$个点的权值之和,并且倍增计算出$f$.在查询是,可以像ST表一样用至多四个$f$中的路径拼出询问路径. ...
- kvm虚拟机创建和管理(2)
- Spring学习记事本
原因:原因:Application的启动类不能放在默认的java目录,必须放在建有包的目录下.
- Leetcode本地阅读器开发--01界面设计二
返回项目声明及目录:Leetcode本地阅读器开发--总声明 继续上一节内容: 1.第一个内容是左边第一行的功能,读取默认路径和修改路径.此路径为本地阅读器的搜索题目的主目录. 为了整个程序都能读取工 ...
- @Scheduled不执行
今天发现@Scheduled不执行,注释掉netty的初始化事件就能正常执行了 原因是@PostConstruct是在主线程执行,@PostConstruct不能堵塞,堵塞会导致整个应用挂起不可用
- jmeter转义
/reportDetail?md5Key%3De7beff4c73ccd8f1cb01c383eda7fed0%26cid%3D1344500703825739777%26isShow%3Dfalse ...