关于多线程下载的缺点

2024-01-03

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


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

首先,我对下载管理器真正提供的“性能”优势持怀疑态度。但更重要的是,它们确实提供的任何好处是not由于多线程。下载的性能限制是带宽连接的。这就是为什么我对这些好处持怀疑态度:

  • 1 Mbps 连接将以 1 Mbps 的速度下载。
  • 将文件分成 4 个段意味着您以 256 Kbps 的速度下载每个段,并且 4 * 256 Kbps = 1 Mbps。
  • 如果服务器限制每个下载段,您可能会得到一些改进。
  • 如果其中一个片段超时,您可能会得到一点好处:其他片段正在下载,这意味着您的连接在超时等待期间不会闲置。
  • 您还可以通过“淹没”任何其他尝试使用该连接的内容来加快下载速度。 (不过我并不是真的认为这是一种好处。)

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

那么多线程的意义何在呢?

首先我们要破除一个误区:多线程does not加快任何事情的速度。如果一个例程需要 X 个时钟周期来运行:它将需要 X 个时钟周期;无论是在 1 个线程还是多个线程上。

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

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

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

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

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

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

然而,更一般地说,即使您的 CPU 密集型工作理论上可以从同时执行不同工作的多个线程中受益,但在实现过程中也很容易犯错误:实际上会减慢你的应用程序速度.

  • 理想情况下,您的多个任务不应共享数据。因为如果他们这样做,那么你就有风险竞争条件 or 并发性 bugs.
  • 当他们确实必须共享数据时,您需要以某种方式同步工作以避免上述错误。 (有很多技术可以根据自己的需要进行选择,这里不再赘述。)
  • However if your synchronisation is poorly planned you risk introducing a number of problems that can significantly slow down your application. These include:
    • 通过共享资源造成瓶颈,使您的多个线程在任何情况下都无法同时运行。
    • 高锁争用,任务花费更多时间等待而不是工作。
    • 甚至死锁也会完全阻止某些任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于多线程下载的缺点 的相关文章

  • 如何使用多线程

    我有这个代码 import thread def print out m1 m2 print m1 print m2 print n for num in range 0 10 thread start new thread print o
  • Java 中的 LRU 缓存实现

    我看过下面的代码 我认为addElement方法的实现中有一个无用的while循环 它永远不应该有比 size 1 更多的元素 因为已经有一个写锁 那么为什么 addElement 方法会删除元素直到它达到这个条件 真的 while con
  • 从辅助线程重定向标准输出(使用函数而不是类进行多线程?)

    我正在努力让我的stdout显示在QTextEdit通过 Qt Designer PyQt5 制作 实际上我让它工作了 但它并没有在制作的同时显示信息 相反 它会等待进程完全结束 然后才会立即显示所有信息 我知道这应该通过线程来解决 也自Q
  • 使用 WaitHandle.WaitAll 时是否可以对 ThreadPool 中的任务进行分组/隔离?

    我面临的情况如下 因为 ThreadPool 每个进程有 1 个实例 所以我的问题是方法 1 会在 3 秒后取消按方法 2 排队的任务 http请求进来 method 1 gets executed first ThreadPool Que
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • nHibernate 使用 Log4Net 进行日志记录,线程会话问题

    大家好 这里有一个小问题 我正在努力解决这个问题 我目前正在开始使用 nHibernate 由于工作需要 我不得不这样做 并且我在 nHibernate 的会话和多线程方面遇到了一些困难 我想在这里完成的任务是让 Log4Net 将所有内容
  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • 依赖于不同队列上的另一个操作的 NSOperation 无法启动

    我有操作的依赖图 并且使用多个队列来组织各种操作流 例如 peopleQueue sitesQueue sessionQueue sessionQueue loginOp fetchUpdatedAccountOp peopleQueue
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 从另一个线程调用线程中的方法,python

    如何实现线程之间的通信 我有一个线程在其中执行一些操作 然后我需要从位于主程序线程中的对象调用一个方法 并且该方法应该在主进程中执行 class Foo def help self pass class MyThread threading
  • 如何为每个线程自动全局初始化/取消初始化某些内容?

    我有一个单位initialization and finalization部分 该单元包含一个复杂的对象 该对象在initialization并毁于finalization 但是 该对象还包含一个 ADO 连接 这使得跨线程使用它时出现问题
  • Qt:关闭期间线程仍在运行时 qthread 被销毁

    我有一堂课 class centralDataPool public QObject Q OBJECT public centralDataPool QObject parent 0 centralDataPool commMonitor
  • SQLite同时读写

    我读过很多主题 但无法找到问题的答案 是否可以同时读写 我有后台线程更新一些数据 UI 需要存储在数据库中的一小部分数据 所以在UI线程中执行SELECT操作 但当更新正在进行时它会阻塞 结果 UI 冻结了几秒钟 有人在写入时成功从数据库读
  • 检测您何时进入/退出 Xamarin.iOS 中的主线程

    Xamarin MonoTouch 有没有办法检测主线程中是否正在调用代码 我正在寻找类似于Java的东西EventQueue isEventDispatchThread 我发现 Swing 编程很方便assert时不时 或有时assert
  • .NET 或 Windows 同步原语性能规范

    我目前正在写一篇科学文章 我需要非常准确地引用 有人可以向我指出 MSDN MSDN 文章 一些已发表的文章来源或一本书 我可以在其中找到 Windows 或 NET 同步原语的性能比较 我知道这些是按性能降序排列的 互锁 API 关键部分
  • Java 中的下载管理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要通过 FTP HTTP 从 Java 获取几个大文件 几个演出 有现成的库 java 命令行工具
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • PHP 文件服务脚本:下载不可靠?

    这篇文章最初是关于 ServerFault 的一个问题 https serverfault com questions 131156 user receiving partial downloads https serverfault co

随机推荐

  • 在基于范围的 for 中强制使用 cbegin()/cend()

    这个问题指的是 我什么时候应该使用新的 ranged for 以及我可以将它与新的 cbegin cend 结合使用吗 https stackoverflow com questions 5814553 ranged for and cbe
  • Python-如何生成末尾带有新数字的变量列表

    我想做的是找到一种更简洁的方法来创建彼此相似的空列表变量 除了末尾的数字不同之外 For example var1 var2 var3 var4 varN with the end goal of var list var1 var2 va
  • Android 检测代码覆盖率报告,包括所有应用程序模块

    我有一个带有多个库模块的 Android 项目 在应用程序模块中 我有一些仪器测试来测试应用程序的主要功能 我想在运行这些测试时记录代码覆盖率 运行gradle任务 createDebugCoverageReport 时 生成了覆盖率报告
  • 如何从 .gitignore 中列出的存储库中删除文件而不更改空格

    我已经阅读了如何使用 git 命令从存储库中删除忽略文件中的文件 将目录添加到 gitignore 后从远程存储库中删除它们 https stackoverflow com questions 7927230 remove director
  • 如何在url中显示用户名

    谁能告诉我如何在 URL 中显示用户名 如果名称在 URL 中传递 username GET username echo Welcome back username 我想显示像 www example com 用户名 当他登录时 如何在用户
  • 如何仅重试 RxJs 中可观察源发出的某些错误

    srcObservable retry 将捕获 srcObservable 发出的错误并重新订阅 srcObservable 无论错误的类型如何 然而 在某些情况下 只希望重试 srcObservable 发出的某些类型的错误 有没有办法在
  • 将具有多个句子的字符串中句子的第一个单词大写

    eg String s 这是a line is over 应该出来为 这是一条线 结束了 我想过两次使用字符串标记器 first split using second split using to get the first word th
  • 对于“Pentium4 及以上”处理器,gcc 的最佳 March 和 mtune 选项是什么

    我的 C 应用程序 使用 g 编译 需要在 Pentium 4 32 位 及更 高版本上运行 但是 它通常与 Core2Duo 或更好的处理器一起使用 我目前正在使用 march pentium4 mtune pentium4 但一些阅读促
  • ggplot结果输出为一份pdf文件,但在R中输出几页

    我至少有 10 个 ggplot 绘图 我们可以称它们为plot1 plot2 我可以将它们输出到单独的 pdf 文件中 但我更喜欢只将它们输出到一个 pdf 文件中 而不是几页 一页 来自 ggplot 的一个图 我尝试列出所有绘图并使用
  • 如何监控Python文件的变化?

    如果代码发生更改 我想重新启动我的 Python Web 应用程序 但是可能有大量文件可以更改 因为导入模块中的文件可能会更改 如何从导入的包 模块中获取实际的文件名 如何高效检测修改过的Python文件 有图书馆可以做到这一点吗 无耻的插
  • 从大表中删除大量记录的有效方法

    我想从 MySql 数据库中的大表 500K 记录 中删除大量记录 200K 我想让这个调用尽可能高效 因为我不希望数据库在执行调用时变得 无响应 我需要删除 早于 10 天的记录 根据created at列 目前我使用 delete fr
  • 无法在 github 操作中获取发布标题

    我添加了 github 操作 该操作会在每次发布时在我们的 slack 通道上发送一条消息 我已经设法从 github 上下文获取仓库名称和标签 https docs github com en actions learn github a
  • 502 - Web 服务器在充当网关或代理服务器时收到无效响应

    当我将应用程序发布到 Azure 网站时 我收到标题错误 但没有任何效果 这不是暂时的 我研究了一下 看起来它与人们遇到的错误问题无关 我启用了日志记录 但没有得到太多重要的输出 日志说 2014 01 15 10 56 26 1MANDO
  • 如何在RecyclerView中实现部分可见的下一项

    我使用 onFling 一次滚动一个项目 并且希望只有一个项目在页面上完全可见 而下一个项目部分可见 我想要这个 我怎样才能在RecyclerView中实现这个目标 这是适配器代码 只是代替了cardView 如图所示 它是imageVie
  • 使用选项卡按钮重新输入后 DataGrid CurrentItem != SelectedItem

    这个简单的 WPF DataGrid
  • JavaScript 中可链接的、基于 Promise 的类接口

    我正在用 JavaScript 编写一个构造函数 它具有以下属性 function WhizBang var promise this publicMethod One function publicMethod One this publ
  • 允许用户从 TableView 复制数据

    我有一个简单的 JavaFX 应用程序 允许用户查询数据库并查看表中的数据 我希望用户能够单击表格单元格 并使用标准剪贴板按键将文本从该单元格复制到剪贴板 对于 Win Linux 为 ctrl c 对于 Mac 为 cmd c 仅供参考
  • 从 Angular 2 服务创建并返回 Observable

    这更多的是一个 最佳实践 问题 共有三名玩家 aComponent a Service and a Model The Component正在呼叫Service从数据库获取数据 这Service正在使用 this people http g
  • React redux oop 类

    来自角度 我曾经为数据库中的每个实体都有一个类 这样的类封装了所有实体行为 例如用户类可以看起来像 export class User static notValid u return u id u id gt 0 u fullname u
  • 关于多线程下载的缺点

    我有一个关于多线程下载的问题 正如您所知 使用多个线程下载可以提高应用程序的性能 但是有一些措施需要尊重 例如线程数 可用带宽等等 但我不太明白 为什么例如 使用多个线程可能会降低应用程序的性能 或者服务器的带宽 质量如何影响多线程应用程序