【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 语 ...
随机推荐
- vue界面显示无效的token
返回登陆界面,重新登陆 登陆成功
- 机器学习——常见的backbone
参考链接:https://www.zhihu.com/question/396811409/answer/1252521120 LeNet:5层轻量级网络,一般用来验证小型数据: AlexNet/VG ...
- 最长公共子序列(LCS)tzoj:5752
http://www.tzcoder.cn/acmhome/problemdetail.do?method=showdetail&id=5752 题意:求两个串的最长公共子序列(顺序相同即为子 ...
- 关于Docker容器内不能ping通外网
先在主机重启docker服务 systemctl stop docker systemctl start docker 然后再开启容器,进入容器 https://blog.csdn.net/qq_42 ...
- 使用C++进行冒泡排序
#include "pch.h" #include <iostream> using namespace std;手动输入10个数,进行冒泡排序 int main() ...
- 前端通过input 输入框实现动态添加行 , 键盘上下左右点击可同步操作中心位置
1. input 代码 ,我们项目组的input封装了,不过不影响使用 通过 @keyup 事件绑定show方法,需要将当前行的信息以及index传递,方便操作 另外要单独给这些需要操作的输入框添加c ...
- 用python遍历一个图片文件夹,并输出所有路径到一个 txt 文件
1 #coding:utf8 2 import os 3 import sys 4 def listfiles(rootDir, txtfile, label=0): 5 ftxtfile = ope ...
- php后端遇到的问题
1.用文件记录日志,会有并发问题
- 【jmeter】请求域名解析失败,添加本地代理
jmeter HTTP请求URL中使用域名 http://xxx.xxx.xxx,异常:java.net.UnkownHostException 原因:请求域名没有被解析成功,该http请求没有通过本 ...
- JAVA基础Day3-用户交互Scanner/顺序结构/选择结构/循环结构
一.用户交互Scanner JAVA提供了一个工具类,可以用来获取用户的输入. java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入. 基本语法: Scan ...