【发布时间】:2015-04-11 07:49:09
【问题描述】:
我有来自 Web 服务的响应,如果数据项的数量很大,我想将其拆分为更小的请求,并并行执行请求和随后对该请求的解析。本质上,当第一个请求解析数据时,后续请求应该会获取它。
似乎有很多方法可以做到这一点,我想知道期货是否适合这种情况。我听到一些 cmets 不应该将期货用于 IO,而论点则相反。
实际上,我正在尝试这样做:
void Service::GetData(const Defn &defn) {
// Split up the request into chunks if the list is large
size_t chunk_size = CONFIG.GetInt("Limits","BatchSize");
if(chunk_size == 0) {
auto response = GetResponse(defn);
Parse(defn, *response);
} else {
std::vector<std::future<std::unique_ptr<Response>>> futures;
for(int batch_num = 0; batch_num < (std::ceil(cardinality / chunk_size)); batch_num++) {
futures.emplace_back(std::async(std::launch::async, &Service::GetResponse, defn, chunk_size, batch_num * chunk_size));
}
for(auto&& future : futures ) {
Parse(defn, *future.get());
}
}
}
std::unique_ptr<Response> Service::GetResponse(const Defn &defn, size_t top, size_t skip) {
// Do request and return response
}
但是,我收到一个错误“错误 C2064:术语不计算为采用 3 个参数的函数”,我不知道为什么。期货是否不允许将它们放入诸如向量之类的容器中?
如果是这样,我应该以不同的方式处理这个问题,还是有不同的方法来获取期货列表? IE。我必须使用打包任务吗?
我认为,理想情况下,这应该与内核数量更接近,而不是随意将响应分成块,然后尝试为每个块创建一个线程。
【问题讨论】:
-
Service::GetResponse()是静态成员函数吗? -
没有。它只是一个普通的类函数。
-
那你为什么不把
std::async中的对象传进去呢?GetResponse有 4 个参数 -this、defn、top和skip。 -
卫生署!错过了。谢谢!在某种程度上,这是我的问题的一部分,但另一部分是关于期货的。这里应该使用期货吗?还是为IO创建一个线程池更合适。我无法直接回答何时不使用期货进行 IO。
-
我已经写了答案>
标签: multithreading c++11 concurrent.futures