我收到来自Web服务的响应,如果数据项的数量很大,我想将其拆分为较小的请求,并执行请求并随后解析该请求。实质上,当第一个请求正在解析数据时,后续请求应该是获取它。
似乎有很多方法可以做到这一点,我想知道在这种情况下期货是否合适。我听到一些评论说未来不应该用于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
}
但是,我收到一个错误&#34;错误C2064:term不会评估为一个带3个参数的函数&#34;而且我不确定为什么。期货不允许将它们放入诸如矢量的容器中吗?
如果是这样,我是否应该以不同的方式接近,或者是否有不同的方式来获取未来的清单?即我是否必须使用打包的任务?
理想情况下,我认为,这应该更接近核心数量,而不是随意分解块中的响应,然后尝试为每个块创建一个线程。
答案 0 :(得分:1)
futures.emplace_back(
std::async(std::launch::async,
&Service::GetResponse, pService, defn, chunk_size, batch_num * chunk_size)
// ^^^^^^^^
);
由于GetResponse不是静态成员函数,因此您应该将该对象作为参数。
我不知道你做了什么完全,所以我不能给你具体的建议&gt; o&lt;
但是,如果您对使用future
的异步任务感兴趣,我会向您介绍boost.asio。它是一个异步I / O库(是的, AS ynchronous I / O ),它可以轻松地与std::future
合作或boost::future
。 (见this my question)
在您的代码中,我认为Parse()
也可以进入future
。
futures.emplace_back(
std::async(std::launch::async,
[&] { GetResponse(...); Parse(...); }
)
);
如果Parse
不需要在同一个帖子中运行或经常运行,我认为它会更好 - 您可以运行多个Parse
和多个GetResponse
并行。