关于多线程下载的缺点

Saf*_*afa 5 multithreading download

我有一个关于多线程下载的问题,因为你知道使用多个线程下载可以提高应用程序的性能,但是有一些措施要尊重:比如线程数,可用带宽等等,但我真的不明白,为什么例如,使用多个线程可能会降低应用程序的性能,或者服务器的带宽,质量如何影响多线程应用程序的性能?,monothread下载比多线程更快的情况是什么?
谢谢你的回复.

Dis*_*ned 10

我假设您指的是下载管理器.

首先,我怀疑下载管理器真正提供了多少"性能"好处.但更重要的是,他们不提供任何的好处是不是因为多线程.下载的性能约束是连接的带宽.这就是为什么我对这些好处持怀疑态度:

  • 1 Mbps连接将以1 Mbps的速度下载.
  • 将文件拆分为4个段意味着您以256 Kbps和4*256 Kbps = 1 Mbps的速度下载每个段.
  • 如果服务器限制每个下载段,您可能会得到一些改进.
  • 如果其中一个段超时,您可能会得到一个小的好处:其他段下载意味着您​​的连接在超时等待期间不会闲置.
  • 您也可以通过"淹没"任何其他尝试使用连接的内容来加快下载速度.(并不是说我真的称这是一个好处.)

下载管理器的真正好处在于有效地自动重启下载(即如果可能,不从头开始重新启动).

那么多线程有什么意义呢?

让我们首先消除一个神话:多线程不会加速任何事情.如果例程需要运行X个时钟周期:它将需要X个时钟周期; 无论是1个线程还是多个线程.

什么多线程不会做的事:它允许任务运行的同时(同时).

同时做不同事情的能力意味着:

  • 一个缓慢的任务(组合大型下载的各个部分)可以在不同的线程上完成,而不会干扰需要快速响应的其他线程(例如用户界面).
  • 并发任务还可以更有效地使用更多可用资源(多个CPU).注意(在问题的最后部分),如果你只有一个CPU,那么你的线程被操作系统"时间分片",所以它不是真正的并发.但时间片非常小,所以以前的好处仍然适用.

什么时候单线程比多线程更快?

好吧,几乎总是在CPU不是瓶颈的情况下.在下载的情况下:如前所述,瓶颈是连接的两个端点之间的带宽.许多线程实际上意味着你必须做更多的工作(管理和协调不同的线程).

最有效的下载方法是2个线程:一个用于UI,另一个用于下载,因此任何暂停/ dealys都不会停止用户界面.

但是,更一般地说,即使你有CPU密集型工作理论上可以从多个线程同时执行不同工作中受益,但实际上很容易在实现中出错,这实际上会降低应用程序的速度.

  • 理想情况下,您的多个任务不应共享数据.因为如果他们这样做,那么你冒着竞争条件并发错误的风险.
  • 当他们必须共享数据时,您需要以某种方式同步工作以避免上述错误.(根据您的需要,有许多技术可供选择,我在此不再赘述.)
  • 但是,如果您的同步计划不当,则可能会出现一些可能会严重降低应用程序速度的问题.这些包括:
    • 通过共享资源进行瓶颈处理,使您的多线程在任何情况下都无法同时运行.
    • 高锁争用,其中任务花费更多时间等待工作.
    • 甚至可以完全阻止某些任务的死锁.

  • 这个答案在其核心主张中是非常错误的。下载经常不受下载者连接的限制。超过10兆位的连接速度已经很常见了十年或更长时间。但是,在SERVER端,大多数下载限制在2兆位左右。这是由文件主机完成的,以节省带宽。可以想象,下载管理器可以通过以下方式利用此漏洞:对下载进行多线程处理,并同时从一个或多个主机下载同一文件的不同部分,然后最后将它们组合在一起。五个2兆位下载流为您提供10兆位的总DL速率。 (3认同)
  • 我认为您低估了每个连接限制下载的频率。在我意识到某些大型应用程序需要 30 分钟下载(以 200kbps)的原因是因为每个连接节流之后,我最近一直在使用多线程下载器来处理某些事情。现在这些下载需要 1 分钟并下载。我看到这种情况经常发生,因为我一直在使用 EagleGet 扩展。特别是在带有视频的较小网站上,它可以让我更快地下载视频而无需不断缓冲。 (2认同)