用于在磁盘上进行内容检索(GET)和数据写入的多个线程
Multiple threads for content retrieval (GET) and data write on disk
我需要对服务器进行不同的GET查询,以下载一堆json文件,并将每次下载都写入磁盘,我想启动一些线程来加快速度。
每个文件的每次下载和写入大约需要0.35秒。
我想知道,至少在linux下(既然我们在这里,在Windows下),并行写入磁盘是否安全,以及考虑到每个线程的等待时间,我可以启动多少线程。
如果它改变了一些东西(我实际上是这么认为的),程序不会直接写入磁盘。它只是调用std::system
来运行程序wget
,因为目前这样做比导入库更容易。因此,等待时间是系统调用返回所需的时间。
因此,每次写入磁盘都是由不同的过程执行的。我只等待程序完成,实际上我不受I/O的约束,而是受外部进程的运行时间的约束(每个wget
调用都创建并写入不同的文件,因此它们是完全独立的进程)。每个线程只等待一个调用完成。
我的机器有4个CPU。
欢迎使用某种公式,根据CPU并发性和每个线程的"等待时间"来获得理想的线程数。
注意:理想的解决方案当然是进行一些性能测试,但如果我滥用这么多请求,我可能会被禁止使用服务器。
从多个线程执行并发文件I/O是安全的,但如果您同时写入同一文件,则需要某种形式的同步,以确保对文件的写入不会交错。
对于您所描述的问题,在一个单独的线程中获取每个JSON blob并将其写入不同的、唯一的文件是非常安全的(事实上,这可能是最明智、最简单的设计)。假设您提到在4核机器上运行,我希望看到一个远远超过4个并发线程标记的加速;网络和文件I/O往往会造成相当大的阻塞,因此在遇到处理瓶颈之前,您可能会遇到网络I/O的瓶颈(或服务器的发送能力)。
编写代码以便控制派生的线程数量,并对不同数量的线程进行基准测试。我猜你的最佳点会在8到16个线程之间。
- 在cuda线程之间共享大量常量数据
- 将线程中的数据存储到全局容器的最佳方法?
- 线程之间的实时数据共享
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 在线程函数中处理数据向量时进行线程竞速
- 使来自线程的数据流对所有其他线程都可读
- 简单使用 std::atomic 在两个线程之间共享数据
- 为什么添加延迟会提高此多线程环境中的数据吞吐量?
- 跨线程共享数据集与拆分每个线程的数据
- 标准 cpp 数据结构和线程互斥锁?
- 在std::线程中使用已分配的结构数据
- 多个线程将数据发送到数组C++
- Qt C++ - 如何将数据从工作线程传递到主线程?
- 在使用 std::cout 和多线程程序中如何避免数据竞争<iomanip>?
- 充分私有化 OpenMP 线程中的数据
- 用于在C++中计算用户数据的线程
- 在不减慢线程速度的情况下保存大量数据
- 线程清理器检测到数据争用,问题出在哪里?
- Qt 如何将数据从一个 GUI 传递到另一个线程