标签:rand WaitGroup int Demo chan Golang num func
并发控制
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)
}
标签:rand,WaitGroup,int,Demo,chan,Golang,num,func 来源: https://www.cnblogs.com/jiangxu67/p/16183948.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。