登录
首页 >  Golang >  Go问答

我将如何限制 golang 中服务器的上传和下载速度?

来源:Golang技术栈

时间:2023-05-01 10:41:38 180浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《我将如何限制 golang 中服务器的上传和下载速度?》,文章讲解的知识点主要包括golang,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

我将如何限制 golang 中服务器的上传和下载速度?

我正在编写一个 golang 服务器来允许用户上传和下载文件。文件很大,大约 1GB 字节。我想将上传和下载速度限制为(例如)1MB/s(当然可以配置)。

以下是我的上传代码:

func uploadFile(w http.ResponseWriter, r *http.Request) {
    file, _, err := r.FormFile("file")

    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    defer file.Close()

    os.MkdirAll(`e:\test`, os.ModePerm)
    out, err := os.Create(`e:\test\test.mpg`)
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    defer out.Close()

    _, err = io.Copy(out, file)
    if err != nil {
        http.Error(w, err.Error(), 500)
    }
}

正确答案

有一个令牌桶算法可以帮助实现这样的速率限制。我找到了一个示例实现,您可以使用它:https ://github.com/juju/ratelimit

package main

import (
    "bytes"
    "fmt"
    "io"
    "time"

    "github.com/juju/ratelimit"
)

func main() {
    // Source holding 1MB
    src := bytes.NewReader(make([]byte, 1024*1024))
    // Destination
    dst := &bytes.Buffer{}

    // Bucket adding 100KB every second, holding max 100KB
    bucket := ratelimit.NewBucketWithRate(100*1024, 100*1024)

    start := time.Now()

    // Copy source to destination, but wrap our reader with rate limited one
    io.Copy(dst, ratelimit.Reader(src, bucket))

    fmt.Printf("Copied %d bytes in %s\n", dst.Len(), time.Since(start))
}

运行后,输出为:

Copied 1048576 bytes in 9.239607694s

您可以使用不同的存储桶实现来提供所需的行为。在您的代码中,设置正确的令牌桶后,您将调用:

_, err = io.Copy(out, ratelimit.Reader(file, bucket))

理论要掌握,实操不能落!以上关于《我将如何限制 golang 中服务器的上传和下载速度?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>