关于多线程下载的缺点

萨法

我有一个关于多线程下载的问题,正如您所知,使用多个线程进行下载可以提高应用程序的性能,但是有一些值得尊重的措施:例如线程数,可用带宽等等,但是我并不十分了解,为什么例如,使用多个线程可能会降低应用程序的性能,或者服务器的带宽,质量如何影响多线程应用程序的性能?,在什么情况下单线程下载比多线程快?
多谢您的回覆。

幻灭

我认为您指的是下载管理器。

首先,我对下载管理器真正提供多少“性能”表示怀疑。但更重要的是,他们不提供任何的好处是不是因为多线程。下载的性能限制是连接带宽这就是为什么我对收益表示怀疑的原因:

  • 1 Mbps连接将以1 Mbps下载。
  • 将文件分成4个段意味着您以256 Kbps和4 * 256 Kbps = 1 Mbps的速度下载每个段。
  • 如果服务器限制每个下载段,则可能会有所改善。
  • 如果其中一个段超时,您可能会得到一点好处:其他段的下载意味着您​​的连接在超时等待期间不会处于空闲状态。
  • 您还可以通过“淘汰”其他任何试图使用该连接的方式来加快下载速度。(但并不是说我真的会称之为好处。)

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

那么多线程的意义何在?

让我们首先消除一个神话:多线程并不能加快任何速度。如果一个例程需要运行X个时钟周期:它将花费X个时钟周期;无论是1个线程还是多个线程。

多线程的作用是:它允许任务同时(同时)运行。

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

  • 可以在不同的线程上完成缓慢的任务(组合大量下载的各个部分),而不会干扰需要快速响应的其他线程(例如用户界面)。
  • 并发任务还可以更有效地使用更多可用资源(多个CPU)。请注意(回答问题的最后一部分),如果您只有一个CPU,则操作系统会对线程进行“时间分割”,因此它不是真正的并发。但是时间片很小,因此以前的好处仍然适用。

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

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

下载的最有效方法是2个线程:一个用于UI,另一个用于下载,这样任何暂停/执行都不会使用户界面停滞。

但是,更一般而言,即使您具有CPU密集型工作,理论上可以从多个线程同时执行不同工作中受益,也很容易在实现中犯错误,而这实际上会使您的应用程序变慢

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多线程HTTP下载器

来自分类Dev

多线程HTTP下载器

来自分类Dev

关于Task,async和await的多线程

来自分类Dev

关于标准c ++多线程的简单问题

来自分类Dev

构造所有类似于CSP的多线程的缺点

来自分类Dev

多线程文件传输/使用javascript下载

来自分类Dev

多线程下载字符串delphi

来自分类Dev

多线程Java下载器正在下载损坏的文件?

来自分类Dev

关于Python和C中的多线程的困惑

来自分类Dev

关于Direct2D绘图调用中的多线程

来自分类Dev

使用多线程在Java中下载文件

来自分类Dev

python中的多处理/多线程下载文件

来自分类Dev

从命令行多线程批量下载URL

来自分类Dev

用于在Python中下载NCBI文件的多线程

来自分类Dev

使用多线程在Java中下载文件

来自分类Dev

使用多线程的Java中的下载管理器

来自分类Dev

python中的多处理/多线程下载文件

来自分类Dev

在python中使用多线程下载文件

来自分类Dev

多线程下载管理器和 DataGridView

来自分类Dev

用于下载多个文件的 NSURLSession 和多线程

来自分类Dev

关于redis工作的矛盾之处:redis是单线程还是多线程?

来自分类Dev

多线程

来自分类Dev

多线程

来自分类Dev

多线程多线程程序

来自分类Dev

如何使用Python 2.7通过HTTP使用多线程下载文件(异步下载)

来自分类Dev

多线程,线程同步

来自分类Dev

关于(if和esle if函数)的缺点

来自分类Dev

使用python yfinance多线程下载Yahoo股票历史记录

来自分类Dev

QtConcurrent与多线程的QThread的多线程性能