在C++ 14中的for循环中并行网络下载

yar*_*ari 1 c++ parallel-processing networking c++14

我有一个链接列表,我想要并行下载数据.

并行启动大量下载作业并获取结果的最佳方法是什么?

我的顺序循环看起来像这样:

vector<string> download_results;

for (string link : links) {
   string data = download_data(link);
   download_results.push_back(data);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能推出download_data(link)并行,同时保持数据的排列download_results一样在上面的顺序循环?

Yak*_*ont 6

std::vector<std::future<std::string>> downloads;

for (string link : links) {
  auto data = std::async( std::launch::async, [link]{return download_data(link);} )
  downloads.push_back(std::move(data));
}
std::vector<std::string> download_results;
for( auto&& dl:downloads ){
  download_results.push_back(f.get());
}
Run Code Online (Sandbox Code Playgroud)

这可以通过限制连接数量和使用来改进reserve.例如,使用线程池或期货队列,当您达到限制时开始弹出.在我认为线程池是最好的,因为当任何旧的下载完成时,它会排队一个新的下载,而队列可能会在早期的大型下载中停止.

理论上你可以编写"只有10个下载活动"代码来定制,但这就是将业务逻辑与资源管理混合在一起.

我已经发布threaded_queue,并thread_pool在SO过去; 谷歌会找到他们.