【Golang】Demo
2022/4/23 23:44:13
本文主要是介绍【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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享