golang频率限制 rate详解
golang.org/x/time/rate 提对速度进行限制的算法
l := rate.NewLimiter(1, 3) // 一个参数为每秒发生多少次事件,第二个参数是最大可运行多少个事件(burst)
Limter提供三中主要的函数 Allow, Reserve, Wait. 大部分时候使用Wait
Wait/WaitN 当没有可用事件时,将阻塞等待
c, _ := context.WithCancel(context.TODO()) for { l.Wait(c) fmt.Println(time.Now().Format("04:05.000")) }
输出
07:35.055 07:35.055 07:35.055 07:36.060 07:37.059 07:38.059
缓存3次后,每秒执行一次
Allow/AllowN 当没有可用事件时,返回false for { if (l.AllowN(time.Now(), 1)) { fmt.Println(time.Now().Format("04:05.000")) } else { time.Sleep(1 * time.Second / 10) fmt.Println(time.Now().Format("Second 04:05.000")) } }
Reserve/ReserveN 当没有可用事件时,返回 Reservation,和要等待多久才能获得足够的事件
for { r := l.ReserveN(time.Now(), 1) s := r.Delay() time.Sleep(s) fmt.Println(s, time.Now().Format("04:05.000")) }
补充:关于golang.org/x包问题
由于谷歌被墙,跟谷歌相关的模块无法通过go get来下载
解决方法:
git clone https://github.com/golang/net.git $GOPATH/src/github.com/golang/net
git clone https://github.com/golang/sys.git $GOPATH/src/github.com/golang/sys
git clone https://github.com/golang/tools.git $GOPATH/src/github.com/golang/tools
ln -s $GOPATH/src/github.com/golang $GOPATH/src/golang.org/x
如果是Windows下,最后一条可以替换为mklink命令,或者直接拷贝文件夹修改一下名称即可。
go的官方包都在这个目录下:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。
相关推荐
-
golang xorm及time.Time自定义解决json日期格式的问题
golang默认的time.Time类型在转为json格式时不是常用的2019-05-08 10:00:01这种格式,解决办法是自定义一个时间类型,例如 type myTime time.Time ,然后针对myTime实现Marshaler接口的MarshalJSON方法,例如: package models import ( "database/sql/driver" "time" ) const localDateTimeFormat string = &qu
-
golang time包做时间转换操作
Time类型 Now方法表示现在时间. func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 返回现在的时间, func (t Time) Unix() int64将时间转换为unix时间戳,因为duration的限制,所以应该只能计算从1970年开始的250年左右 func Unix(sec int64, nsec int64) Time将时间戳转化为Time对象,看上去相似,只不
-
golang xorm日志写入文件中的操作
golang访问数据库记录SQL语句: 使用的包为: 1:github.com/arthurkiller/rollingwriter //写入日志包 2: github.com/go-xorm/xorm //xorm包 具体实现为: package main import ( "time" "github.com/arthurkiller/rollingwriter" _ "github.com/go-sql-driver/mysql" &quo
-
浅谈Golang的方法传递值应该注意的地方
其实最近看了不少Golang接口以及方法的阐述都有一个地方没说得特别明白.就是在Golang编译隐式转换传递给方法使用的时候,和调用函数时的区别. 我们都知道,在我们为一个类型变量申明了一个方法的时候,我们可以使用类似于self.method来调用这个方法,而且无论你申明的方法的接收器是指针接收器还是值接收器,Golang都可以帮你隐式转换为正确的值供方法使用. 让我们来看一个例子: package main import "fmt" type duration int func (d
-
Golang中的time.Duration类型用法说明
在 Time 包中,定义有一个名为 Duration 的类型和一些辅助的常量: type Duration int64 const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute ) 那么我们看下面一段代码: func Test(
-
golang频率限制 rate详解
golang.org/x/time/rate 提对速度进行限制的算法 l := rate.NewLimiter(1, 3) // 一个参数为每秒发生多少次事件,第二个参数是最大可运行多少个事件(burst) Limter提供三中主要的函数 Allow, Reserve, Wait. 大部分时候使用Wait Wait/WaitN 当没有可用事件时,将阻塞等待 c, _ := context.WithCancel(context.TODO()) for { l.Wait(c) fmt.Println
-
Django 限制访问频率的思路详解
最近做了一个系统由于部分接口需要进行耗时操作,因而不希望用户进行频繁访问,需要进行访问频率限制.如果要自己实现一个访问限制功能相对来说也不会太复杂,并且网上有各种代码可以参考.如果自己不想实现这个代码可以使用 Django Ratelimit. Django Ratelimit is a ratelimiting decorator for Django views. https://travis-ci.org/jsocol/django-ratelimit.png?branch=master
-
golang之log rotate详解
操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 golang的log模块提供的有写日志功能,示例代码如下: /* golang log example */ package main import ( "log" "os" ) func main() { logFile,err := os.Create("test1.log") defer logFile.Close() if err != nil { log.F
-
Golang与python线程详解及简单实例
Golang与python线程详解及简单实例 在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000. var sum int var cccc int var m *sync.Mutex func Count1(i int, ch chan int) { for j := 0; j < 100000; j++ { cccc = cccc + 1 } ch <- cccc } func main() { m = new(sync.
-
Golang标准库syscall详解(什么是系统调用)
一.什么是系统调用 In computing, a system call is the programmatic way in which a computer program requests a service from the kernel of the operating system it is executed on. This may include hardware-related services (for example, accessing a hard disk dri
-
Golang Protocol Buffer案例详解
Golang Protocol Buffer教程 本文介绍如何在Go应用中利用Protocol Buffer数据格式.主要包括什么是Protocol Buffer数据格式,其超越传统数据格式XML或JSON的优势是什么. 1. Protocol Buffer数据格式 Protocol Buffer,本质就是一种数据格式,和JSON或XML一样,不同的语言用于结构化数据序列化或反序列化.该数据格式的优势是较xml或json更小,源于Google.假如我们有一个对象,我们用三种数据结构进行表示: <
-
Golang分布式应用定时任务示例详解
目录 正文 最小堆 时间轮 总结 正文 在系统开发中,有一类任务不是立即执行,而是在未来某个时间点或者按照一定间隔去执行,比如日志定期压缩.报表制作.过期数据清理等,这就是定时任务. 在单机中,定时任务通常需要实现一个类似crontab的系统,一般有两种方式: 最小堆,按照任务执行时间建堆,每次取最近的任务执行 时间轮,将任务放到时间轮列表中,每次转动取对应的任务列表执行 最小堆 最小堆是一种特殊的完全二叉树,任意非叶子节点的值不大于其子节点,如图 通过最小堆,根据任务最近执行时间键堆,每次取堆
-
Golang 动态脚本调研详解
目录 一.技术背景 1.1 程序的动态链接技术 1.1.1 动态链接库 1.1.2 动态共享对象 1.1.3 非编译语言的动态技术 1.2 Golang 的动态技术 二.Golang 的第三方解释器(Yaegi) 2.1 使用场景 2.1.1 内嵌解释器 2.1.2 动态扩展框架 2.1.3 命令行解释器 2.2 数据交互 2.2.1 数据输入 2.1.2 数据输出 三.实现原理 3.1 AST - 抽象语法树 3.1.1 抽象语法树示例 3.1.2 执行抽象语法树 一.技术背景 1.1 程序的
-
Golang接口使用教程详解
目录 前言 一.概述 二.接口类型 2.1 接口的定义 2.2 实现接口的条件 2.3 为什么需要接口 2.4 接口类型变量 三.值接收者和指针接收者 3.1 值接收者实现接口 3.2 指针接收者实现接口 四.类型与接口的关系 4.1 一个类型实现多个接口 4.2 多种类型实现同一接口 五.接口嵌套 六.空接口 七.类型断言 总结 前言 go语言并没有面向对象的相关概念,go语言提到的接口和java.c++等语言提到的接口不同,它不会显示的说明实现了接口,没有继承.子类.implements关键
-
golang并发锁使用详解
目录 互斥锁 sync.Mutex 读写锁 sync.RWMutex 如果程序用到的数据是多个groutine之间的交互过程中产生的,那么使用上文提到的channel就可以解决了. 如果我们的使用多个groutine访问和修改同一个数据,就需要考虑在并发环境下数据一致性的问题,即线程安全问题. 以存钱为例说明一下问题.假设我们发起一个众筹项目,并发1000个用户的向一个银行银行账号存钱. package main import ( "fmt" "sync" ) va
随机推荐
- 详解使用Docker容器来源码编译etcd
- 基于JS实现网页中的选项卡(两种方法)
- 基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
- ThinkPHP让分页保持搜索状态的方法
- php实现阳历阴历互转的方法
- 用asp+xmlhttp编写web采集程序
- Python学习教程之常用的内置函数大全
- SQLSever中的触发器基本语法与作用
- 一个有趣的SQL命题 用一条语句切换BIT型的真假值
- 有关mysql优化的一些东东整理
- 简单介绍MySQL中的事务机制
- jQuery统计指定子元素数量的方法
- 深入理解JavaScript系列(26):设计模式之构造函数模式详解
- js 幻灯片的实现
- 快速定位注册表收藏夹分支
- Gregarius中文日期格式问题解决办法
- 用PHP制作静态网站的模板框架(四)
- js与flash的交互FLASH连播控制器
- Angularjs之如何在跨域请求中传输Cookie的方法
- JS定义函数的几种常用方法小结