- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有下一个任务(非常抽象):
我们有一个文件夹,其中包含要处理的不同数量的文件(文件数可能是 1、2 或几千个)。每个文件只能顺序处理(这意味着不可能在内存中读取整个文件并在多个线程中处理它)。文件处理的结果应该是生成新文件,也是顺序写入的。如何使用所有可用的 CPU 内核来做到这一点?
我只看到两种方法:
使用由多个线程处理的任务队列。每个任务都处理单个文件,例如从文件读取 block 、处理 block 、将 block 写入结果文件。
使用类似管道模式的东西。我们有一个输入线程,它以异步方式读取文件并将 block 发送到多个处理队列。每个线程读取自己的队列并进行 block 处理。然后将结果发布到输出队列。输出线程写入结果文件。所以我们有 1 个输入读取线程、1 个输出写入线程和几个处理线程。
block 处理不是很快的操作,比读取慢。
操作系统:Mac/Linux,也许是 Windows。
哪种方法更好?我们还有其他解决方案吗?
最佳答案
最好的方法是编写一个简单的 Task 类,它独立执行整个操作(读取、处理、写入),因此与外部线程不安全操作没有任何联系。然后使用一个任务队列,其中固定数量的线程可以获取这些任务并处理它们。好的线程数通常是 cores * 2。
可以从数学上证明,选项 2 总是等于或慢于基于任务的解决方案,并且在所有情况下都会更复杂。选项 2 更可行的唯一情况是当线程切换成为实际瓶颈时。 IE。如果您的服务器有 1000 个并发但有状态的连接但只有一个网卡,那么使用 1 个网络线程来提供 1000 个处理线程会更有效,而不是在通过线路发送的每个字节上唤醒 1000 个线程。
基于任务的解决方案还可以更轻松地测量吞吐量并比较其他线程如何影响吞吐量,因为您可以简单地以任务/秒为单位进行测量。
关于c++ - 如何为多个文件处理选择最佳 I/O 策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756934/
我是一名优秀的程序员,十分优秀!