c++ - 用于内容检索 (GET) 和数据写入磁盘的多线程

标签 c++ linux multithreading disk

我需要向服务器发出不同的 GET 查询以下载一堆 json 文件并将每次下载写入磁盘,我想启动一些线程来加快速度。

每个文件的每次下载和写入大约需要 0.35 秒。

我想知道,至少在 linux 下(以及在 Windows 下,因为我们在这里),并行写入磁盘是否安全,以及考虑到每个线程的等待时间,我可以启动多少个线程。

如果它改变了什么(我真的这么认为),程序不会直接写入磁盘。它只是调用 std::system 来运行程序 wget,因为目前这样做比导入库更容易。所以,等待时间就是系统调用返回的时间。

因此,每次写入磁盘都由不同的进程执行。我只等待那个程序完成,我实际上不受 I/O 的约束,而是受外部进程的运行时间的约束(每个 wget 调用创建并写入不同的文件,因此它们是完全独立的进程)。每个线程只等待一个调用完成。

我的机器有 4 个 CPU。

欢迎使用某种公式根据 CPU 并发性和每个线程的“等待时间”获得理想的线程数。

注意:理想的解决方案当然是进行一些性能测试,但如果我滥用这么多请求,我可能会被服务器禁止。

最佳答案

从多个线程执行并发文件 I/O 是安全的,但是如果您同时写入同一个文件,则需要某种形式的同步来确保对文件的写入不'变得交错。

对于您所描述的问题,在单独的线程中获取每个 JSON blob 并将它们写入不同的唯一文件是完全安全的(事实上,这可能是最明智、最简单的设计)。鉴于您提到在 4 核机器上运行,我希望看到加速超过四个并发线程标记;网络和文件 I/O 往往会造成相当多的阻塞,因此您可能会在遇到处理瓶颈之前遇到网络 I/O(或服务器发送能力)的瓶颈。

编写您的代码,以便您可以控制生成的线程数量,并对不同数量的线程进行基准测试。我猜您的最佳选择是在 8 到 16 个线程之间。

关于c++ - 用于内容检索 (GET) 和数据写入磁盘的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614710/

相关文章:

python - 正则表达式匹配任何保持序列顺序的字符串,即使它不完整

c++ - 向 std::vector 添加结构时的 std::bad_alloc

linux - 使用示例代码测试 Linsched

linux - 如何离线安装docker-compose?

linux - 测试 - 使用 'dd' 故意损坏 .Z 文件

java - 使用单独的线程更新 JTable

c++ - 远程自动构建系统

iOS - 在多个线程上处理照片

c# - IOCP 是在 I/O 发生时或之后运行的线程吗?

窗口内的 C++ CPU 图形