当前位置: 首页 > 面试题库 >

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

周鸿云
2023-03-14
问题内容

在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))


 类似资料:
  • 问题内容: 我想以编程方式限制Java中的上传或下载操作。我假设我需要做的就是检查上传进行的速度并按以下方式进行相应插入: 上面的代码能用吗?如果没有,还有更好的方法吗?是否有描述理论的教程? 问题答案: 令牌桶算法是一种限制上传或下载带宽的方法。您应该阅读本文:它解释了此算法的用法。 使用番石榴RateLimiter: 如Guava文档中所述: 重要的是要注意,所请求的许可数量永远不会影响请求本

  • 问题内容: 我将作为个人练习用Java实现一个(简单的)下载器应用程序。它将在不同的线程中运行多个作业,以这种方式,我将在执行期间始终同时下载几个文件。 我希望能够定义在所有下载作业之间共享的下载速率限制,但是我不知道如何执行单个下载任务。我应该怎么做呢?我应该尝试实施哪些解决方案? 谢谢。 问题答案: 我将从管理所有下载的DownloadManager开始。 希望参与托管带宽的所有代码都将在开始

  • 我试图根据此链接下载siteminder试用版。但是在谷歌上搜索某个地方时,它说siteminder即使对于像Oracle(Express Edition)这样的开发也不是免费的。请澄清我对此的疑问。如果有试用版,请直接到那里找我。提前谢谢。

  • 问题内容: 我们得到了在集群模式下工作的高负载Java应用程序。 我需要增加为客户下载和上传文件的功能。对于存储文件,我不确定要去到用户gridFs,这是最好的选择,但是mongo可以集群,并且mongo可以在diff节点之间复制数据。那正是我所需要的。 应限制不同的用户组使用不同的带宽。根据一些业务规则,我应该限制某些用户的下载速度。我看到一些解决方案,此 它们大多数以相同的方式工作。 读取一堆

  • 本文向大家介绍php限制文件下载速度的代码,包括了php限制文件下载速度的代码的使用技巧和注意事项,需要的朋友参考一下 有时候你会出于某种目的而要求把下载文件的速度放慢一些,例如你想实现文件下载进度条功能。限制下载速度最大的好处是节省带宽,避免瞬时流量过大而造成网络堵塞。本文将和你分享如何通过php代码来实现限制文件的下载速度。 首先来看看利用php限制文件下载速度的代码: 下面对以上代码做一些分