【问题标题】:What is the optimal number of threads to create for an IO bound task?为 IO 绑定任务创建的最佳线程数是多少?
【发布时间】:2017-02-22 08:57:22
【问题描述】:

我想下载一堆很小的 MP3 文件,然后将它们合并成一个大文件。我想知道,如果拥有一个具有四个内核的 CPU,创建多个线程是否会缩短下载所有文件所需的时间。如何确定要创建的最佳线程数?还是有用吗?

【问题讨论】:

  • 为 IO 绑定任务创建的最佳附加线程数为零。你需要异步 IO。线程只能帮助处理 CPU 密集型任务。
  • 下载管理器允许您同时下载多个文件。并发下载的数量与 CPU 或线程无关,它取决于可用带宽和服务器端限制。如果您的连接速度很快并且服务器允许这样做,您可以尝试一次下载 100 个文件

标签: multithreading io


【解决方案1】:

大量编辑,请参阅 cmets 了解原因)

是的,它会有所帮助。但是,瓶颈更有可能是文件的来源。我假设对于本答案的其余部分,您的数据将全部托管在一个来源上。

具有更多多线程经验的人可能在线程与内核方面有更好的输入,但我不确定这是否重要。

您可能需要进行一些试验才能找到最合适的方案,但这取决于很多因素,例如带宽、服务器配置、源服务器的数量以及同时使用该应用的人数是时候访问这些文件了(假设不只是你)。

根据我所做的假设,我会说 3-6 将是一个神奇的数字。以下是我对原因的看法:

  • 如果您运行的数量超过该数量,下载速度很可能会变慢。
  • 因为我们讨论的是较小的文件,所以启动和停止传输会产生很多开销。
  • 如果是大文件,我会说从 3 开始,但由于上面提到的开销,您可能需要加倍。
  • 正如 cmets 中所述,您的线程将有很多 CPU 使用率较低的时期,因此带宽和服务器的瓶颈可能比 CPU 内核的数量更重要。

【讨论】:

  • 实际上,核心和线程与简单的并发下载无关。您在下载管理器中设置了多少并发下载,为什么?它与您的网络连接、服务器端限制以及 服务器 允许您建立的并发连接数有关
  • 我有过这样的想法,但在没有其他限制的详细信息的情况下,假设一台服务器,3-4 似乎是正确的答案,或者至少是一个开始的地方。我想不出更好的方法来解释我的思考过程。
  • 为什么?这完全是任意的。下载主要是空闲时间。即使您阻塞线程,CPU 仍会显示最低使用率。如果您使用异步 API,则在等待服务器响应时 CPU 使用率为 0
  • 最初的 3 到 4 想法来自使用下载管理器从单个服务器下载文件的经验以及对 BitTorrent 工作原理的一些想法,因为我们谈论的是小文件。但是你说得对,我的回答听起来是错误的。我会解决的。
  • 现在应该更有意义了。
猜你喜欢
  • 1970-01-01
  • 2010-11-17
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多