用于内容检索 (GET) 和数据写入磁盘的多线程
Multiple threads for content retrieval (GET) and data write on disk
我需要对服务器进行不同的 GET 查询以下载一堆 json 文件并将每个下载内容写入磁盘,我想启动一些线程来加快速度。
每个文件的每次下载和写入大约需要 0.35 秒。
我想知道,至少在 linux 下(并且在 Windows 下,因为我们在这里),并行写入磁盘是否安全以及我可以启动多少线程考虑到每个线程的等待时间。
如果它改变了什么(我真的这么认为),程序不会直接写入磁盘。它只是调用 std::system
到 运行 程序 wget
因为目前这样做比导入库更容易。所以,等待时间就是系统调用到return.
的时间
因此,每次写入磁盘都是由不同的进程执行的。我只等待那个程序完成,我实际上不受 I/O 的约束,而是受外部进程的 运行ning 时间的约束(每个 wget
调用创建并写入不同的文件,因此它们是完全独立的进程)。每个线程只等待一次调用完成。
我的机器有 4 个 CPUs。
根据 CPU 并发性和每个线程 "waiting time" 获得理想线程数的某种公式将受到欢迎。
注意:理想的解决方案当然是做一些性能测试,但如果我滥用这么多请求,我可能会被服务器禁止。
从多个线程执行并发文件 I/O 是安全的,但是如果您同时写入 同一个 文件,则需要某种形式的同步来确保写入文件不会交错。
对于您所描述的问题,在单独的线程中获取每个 JSON blob 并将它们写入不同的唯一文件是完全安全的(事实上,这可能是最明智、最简单的设计).鉴于您在 4 核机器上提到 运行ning,我希望看到加速超过四个并发线程标记;网络和文件 I/O 往往会造成相当多的阻塞,因此您可能会 运行 遇到网络 I/O 的瓶颈(或服务器的发送能力),然后再点击处理瓶颈。
编写代码以便控制生成的线程数,并对不同的线程数进行基准测试。我猜你的最佳选择是在 8 到 16 个线程之间。
我需要对服务器进行不同的 GET 查询以下载一堆 json 文件并将每个下载内容写入磁盘,我想启动一些线程来加快速度。
每个文件的每次下载和写入大约需要 0.35 秒。
我想知道,至少在 linux 下(并且在 Windows 下,因为我们在这里),并行写入磁盘是否安全以及我可以启动多少线程考虑到每个线程的等待时间。
如果它改变了什么(我真的这么认为),程序不会直接写入磁盘。它只是调用 std::system
到 运行 程序 wget
因为目前这样做比导入库更容易。所以,等待时间就是系统调用到return.
因此,每次写入磁盘都是由不同的进程执行的。我只等待那个程序完成,我实际上不受 I/O 的约束,而是受外部进程的 运行ning 时间的约束(每个 wget
调用创建并写入不同的文件,因此它们是完全独立的进程)。每个线程只等待一次调用完成。
我的机器有 4 个 CPUs。
根据 CPU 并发性和每个线程 "waiting time" 获得理想线程数的某种公式将受到欢迎。
注意:理想的解决方案当然是做一些性能测试,但如果我滥用这么多请求,我可能会被服务器禁止。
从多个线程执行并发文件 I/O 是安全的,但是如果您同时写入 同一个 文件,则需要某种形式的同步来确保写入文件不会交错。
对于您所描述的问题,在单独的线程中获取每个 JSON blob 并将它们写入不同的唯一文件是完全安全的(事实上,这可能是最明智、最简单的设计).鉴于您在 4 核机器上提到 运行ning,我希望看到加速超过四个并发线程标记;网络和文件 I/O 往往会造成相当多的阻塞,因此您可能会 运行 遇到网络 I/O 的瓶颈(或服务器的发送能力),然后再点击处理瓶颈。
编写代码以便控制生成的线程数,并对不同的线程数进行基准测试。我猜你的最佳选择是在 8 到 16 个线程之间。