ratelimit

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 11, 2022 License: Apache-2.0 Imports: 7 Imported by: 0

README

ratelimit

介绍

文件上传下载限速

软件架构

软件架构说明

安装教程

go get github.com/yunboom/generate

使用说明
  1. 读取限速
const (
	rateLimit = 1 << 20 //限速1m/s
	src       = "/Users/zonst/Downloads/1.zip"
	dst       = "/Users/zonst/Downloads/2.zip"
)

var (
	readFile, writeFile *os.File
	err                 error
)

func init() {
	readFile, err = os.Open(src)
	if err != nil {
		panic(err)
	}
	writeFile, err = os.OpenFile(dst, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0755)
	if err != nil {
		panic(err)
	}
}

func TestReadLimit(t *testing.T) {
	//限制读取速度
	now := time.Now()
	reader := NewStorage(rateLimit).Reader(readFile)
	if _, err = ioutil.ReadAll(reader); err != nil {
		t.Fatal(err)
	}
	fmt.Printf("拷贝耗时:%v, 文件大小:%d", time.Since(now), reader.Size())
}
  1. 限制写入速度
const (
	rateLimit = 1 << 20 //限速1m/s
	src       = "/Users/zonst/Downloads/1.zip"
	dst       = "/Users/zonst/Downloads/2.zip"
)

var (
	readFile, writeFile *os.File
	err                 error
)

func init() {
	readFile, err = os.Open(src)
	if err != nil {
		panic(err)
	}
	writeFile, err = os.OpenFile(dst, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0755)
	if err != nil {
		panic(err)
	}
}

func TestWriteLimit(t *testing.T) {
//限制写入速度
now := time.Now()
writer := NewStorage(rateLimit).Writer(writeFile)
if _, err = io.Copy(readFile, writer); err != nil {
t.Fatal(err)
}
fmt.Printf("拷贝耗时:%v, 文件大小:%d", time.Since(now), writer.Size())
}
  1. 限制复制速度
const (
	rateLimit = 1 << 20 //限速1m/s
	src       = "/Users/zonst/Downloads/1.zip"
	dst       = "/Users/zonst/Downloads/2.zip"
)

var (
	readFile, writeFile *os.File
	err                 error
)

func init() {
	readFile, err = os.Open(src)
	if err != nil {
		panic(err)
	}
	writeFile, err = os.OpenFile(dst, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0755)
	if err != nil {
		panic(err)
	}
}

func TestCopyLimit(t *testing.T) {
//限制复制速度
now := time.Now()
if size, err := NewStorage(rateLimit).Copy(readFile, writeFile); err != nil {
t.Fatal(err)
} else {
fmt.Printf("拷贝耗时:%v, 文件大小:%d", time.Since(now), size)
}
}

4.限制上传人数大于3时限速

const (
	rateLimit = 1 << 20 //限速1m/s
	src       = "/Users/zonst/Downloads/1.zip"
	dst       = "/Users/zonst/Downloads/2.zip"
)

var (
	readFile, writeFile *os.File
	err                 error
)

func init() {
	readFile, err = os.Open(src)
	if err != nil {
		panic(err)
	}
	writeFile, err = os.OpenFile(dst, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0755)
	if err != nil {
		panic(err)
	}
}

func TestLimiter(t *testing.T) {
//限制多少人限速
judge.Add()
defer judge.Done()
now := time.Now()
if judge.IsNeedLimit() {
if size, err := NewStorage(rateLimit).Copy(readFile, writeFile); err != nil {
t.Fatal(err)
} else {
fmt.Printf("拷贝耗时:%v, 文件大小:%d", time.Since(now), size)
}
}
}
参与贡献
  1. Fork 本仓库
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewFileLimiter

func NewFileLimiter(rate int64) *fileLimiter

NewFileLimiter 文件读写限速

Types

type Clock

type Clock interface {
	Now() time.Time
	Sleep(time.Duration)
}

type Mode

type Mode int8
const (
	SingleChannel Mode = 1 + iota //Read or Write 使用
	DualChannel                   //Copy方法使用
)

type Storage

type Storage struct {
	// contains filtered or unexported fields
}

func NewStorage

func NewStorage(rate int64) *Storage

func (*Storage) Copy

func (rate *Storage) Copy(src io.Reader, dst io.Writer) (int64, error)

func (*Storage) Read

func (rate *Storage) Read(buf []byte) (n int, err error)

func (*Storage) Reader

func (rate *Storage) Reader(reader io.Reader) *Storage

func (Storage) Size

func (rate Storage) Size() (length int64)

Size 存储桶计算content-length需要

func (*Storage) Write

func (rate *Storage) Write(buf []byte) (n int, err error)

func (*Storage) Writer

func (rate *Storage) Writer(writer io.Writer) *Storage

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL