异步使用Boost.Asio下载URL列表

问题描述:

我是异步编程的新手,Boost.Asio。我有一个基本问题。 boost.org上有example。我想用它来下载链接列表。以下是http异步客户端的客户端代码。异步使用Boost.Asio下载URL列表

int main(int argc, char* argv[]) { 
    try { 
    if (argc != 3) { 
     ... 
     return 1; 
    } 

    boost::asio::io_service io_service; 
    client c(io_service, argv[1], argv[2]); 
    io_service.run(); 
    } 
    catch (std::exception& e) { 
    std::cout << "Exception: " << e.what() << "\n"; 
    } 
    return 0; 
} 

我知道怎样才能下载的URL与此代码。但是,我不知道如何异步(编辑:同时?)下载的URL列表。你能帮我改变这个代码来获得这个目的吗?

+0

因为所有的逻辑都在'client'类直接办理,只需要创建'client'类,一个的多个实例,每个'URL's的在你的清单中。 – Chad

+0

谢谢。但是,如果我有很多链接,就有问题。我可以将原始列表拆分为更小的单词,并分别处理任何单词。然后我需要等待,直到所有的当前chank链接都被处理,然后处理下一个chank。有没有办法避免效率问题? – Loom

样本中的异步存在于以下事实中:所有连接异步处理。这使得许多下载可以在单个线程上同时运行(在您的问题的代码示例中,这是主线程)。

所以样本已经是异步的。现在你正在寻找并发与你的其他代码:)

- >只需在单独的线程上执行io_service::run调用(或在线程上执行其他工作)。

+0

谢谢。其实,我没有意识到id的清晰。你的意思是,我需要[this]这样的东西(http://codelever.com/blog/2013/06/18/using-boost-asio-io-service-in-another-thread/)? – Loom

+0

这是一个非常经常使用的方法是 – sehe

+0

恐怕我还没有赶上,它如何帮助。 – Loom

由Boost.Asio的作者Christopher M. Kohlhoff提供的Urdl HTTP客户端库。

此库有一个允许异步操作的read_stream类。 Accrording到documentation它应该是这样的:

#include <urdl/read_stream.hpp> 

boost::asio::io_service io_service; 
// run io_service some way 

urdl::read_stream in(io_service); 
std::ostream& out = std::cout; 
char data[1024]; 

void open_handler(boost::system::error_code const& ec); 
void read_handler(boost::system::error_code const& ec, std::size_t length); 

in.async_open("http://example.com/path", open_handler); 


void open_handler(boost::system::error_code const& ec) 
{ 
    if (!ec) 
    { 
    in.async_read_some(boost::asio::buffer(data), read_handler); 
    } 
} 

void read_handler(boost::system::error_code const& ec, std::size_t length) 
{ 
    if (!ec) 
    { 
    out.write(data, length); 
    in.async_read_some(boost::asio::buffer(data), read_handler); 
    } 
}