2015-05-29 55 views
2

我是異步編程的新手,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

回答

1

樣本中的異步存在於以下事實中:所有連接異步處理。這使得許多下載可以在單個線程上同時運行(在您的問題的代碼示例中,這是主線程)。

所以樣本已經是異步的。現在你正在尋找併發與你的其他代碼:)

- >只需在單獨的線程上執行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

1

由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); 
    } 
}