gpt4 book ai didi

multithreading - 如何只使用程序可用的带宽

转载 作者:行者123 更新时间:2023-12-04 06:45:46 26 4
gpt4 key购买 nike

我正在制作一个可以下载一堆不同项目的程序。我的语言具有廉价的并发性,所以我首先想到我可以一次下载它们。问题是 using concurrency you don't have is bad .如果我尝试一次下载它们,用户将不得不等待所有它们才能获得它们中的任何一个。

假设您正在下载 10 个可以以 7 mb/s 的速度下载的项目,并且您的下载速度为 20 mb/s。程序应该只开始下载第一个 项目,并且只有在旧项目完成并且有带宽后才会开始下载新项目。另请注意,通常这些项目不会具有相同的下载速度。

如果我有一些编程方法来检查网络饱和度,这将很容易(只需在产生新线程之前检查它是否饱和。)

最佳答案

正如评论中指出的那样,你不能做得很好,无法做出任何保证。但是,无论如何,假设您想尽力而为。

这个问题有两个部分:

  • 确定可用带宽。
  • 控制消耗的带宽。

  • 通过限制从套接字读取的速率,可以在用户空间程序中大致控制消耗的带宽。 TCP/IP 堆栈将通知连接的另一端,代表您的应用程序维护的队列已满,不再发送任何内容。实现该速率限制的一种便捷方法是使用 token buckets .

    快速 token 桶实现:
     int bucket = 0;
    start_thread({ while(transfer_in_progress) {
    bucket += bytes_per_second_limit;
    sleep(1);
    });
    while(transfer_in_progress) {
    bytesread = read(socket, buffer, min(bucket, buffersize), );
    bucket -= bytesread;
    }

    bytes_per_second_limit大致设置为可用带宽,以字节/秒表示,然后应该以连接允许的速度读取。如果连接速度更快,您将被限制为 bytes_per_second_limit .如果连接速度较慢,则 bucket将永远增长,其速度与速度限制和可用带宽之间的差异成正比。

    唔!

    如果您运行另一个线程,并留意 bucket ,您可以观察两个条件:
  • bucket始终为0,则可用带宽更多,您可以增加bytes_per_second_limit ,可能受限于您最近对可用带宽的最佳猜测(来自 #2)。或者开始额外的下载。
  • bucket比您上次查看的时间大,并且数据点的最后几秒似乎表明持续增长(也许做线性回归;无论您喜欢什么),以字节/秒表示的增长速度就是您可以减少多少bytes_per_second_limit以将您的下载速率与可用带宽相匹配。

  • 所有这一切的问题是无法保证您的带宽将保持不变。线程监控 bucket可能会在增加速率和限制速率之间来回反弹。我建议您在更改速率限制之前至少平均 10 或 20 秒。

    关于multithreading - 如何只使用程序可用的带宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717655/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com