【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 语 ...
 
随机推荐
- WPFGroupBox控件自定义
			
先上效果图 直接上代码(直接在Window.Resources里面添加这段代码) <Style TargetType="GroupBox"> <Setter Pr ...
 - Greg and Array CodeForces - 296C - 差分
			
给定一个数列 \(a= { a_1,a_2,...,a_n }\) 以及 \(m\) 次操作,\(q\) 次查询. 其中第 \(i\) 次操作如同:\(l_i, r_i, d_i\),意指区间 \([ ...
 - 微信防红页面JS代码
			
将Js代码复制粘贴到你网站所需要的页面,保存即可,完美实现防红,具体未测试,如果需要可以自己测试效果. <meta charset="utf-8″> <meta name= ...
 - linux(centos7)下部署jenkins
			
1.安装jdk yum install -y java 确保已经安装了jdk,查看是否安装jdk命令参考地址: 2.安装jenkins 2.0添加Jenkins库到yum库,Jenkins将从这里下载 ...
 - MSSQL 查看数据库所有的触发器
			
SELECT object_name(a.parent_obj) as [表名] ,a.name as [触发器名称] ,(case when b.is_disabled=0 then '启用' el ...
 - bzoj 4573
			
LCT神题... 首先暴力的做法就是每次在一个区间上link,然后暴力查询,时间复杂度$O(爆炸)$ 但是我们可以发现的是,每棵树之间互不影响! 因此我们可以考虑离线之后分别统计每棵树 但是这样做其实 ...
 - jmeter支持发送https请求
			
示例网址: https://passport.damai.cn/login 一.Jmeter如何导入SSL证书 步骤1.打开Chrome浏览器访问地址,点击安全锁,导出证书,并复制文件至指定文件目录. ...
 - springboot修改默认端口
			
方案一: src/main/resuorces 文件夹下新建application.properties 文件 并添加内容server.port=8011即可 方案二: 使用EmbeddedServl ...
 - jmeter在Linux上的安装及压力机配置
			
1.jmeter安装 (1)与控制机相同版本的java环境.安装包及插件: (2)关闭控制机上的防火墙: (3)保证机器在同一个局域网中(能ping通): (4)解压安装包,设置JMETER_HOME ...
 - Webpack解析与讲解
			
一.什么是Webpack? 一个基于node.js的前端模块化/预处理/扁平化处理器. 二.为什么要使用Webpack? 解决业务代码中的各种依赖,模块加载,静态文件引入问题(重复依赖/强依赖,阻塞加 ...