簡體   English   中英

使用Boost.Asio異步下載URL列表

[英]Asynchronous download a list of URLs with Boost.Asio

我是異步編程和Boost.Asio的新手。 我有一個基本問題。 boost.org上有一個例子 我想用它來下載一個鏈接列表。 以下是http異步客戶端的客戶端代碼。

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列表。 你能幫助我改變這段代碼來達到這個目的嗎?

Boost.Asio的作者Christopher M. Kohlhoff有一個Urdl HTTP客戶端庫。

該庫有一個允許異步操作的read_stream類。 根據文檔,它看起來像這樣:

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

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

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

- >只需在一個單獨的線程上執行io_service::run調用(或者在一個線程上執行其他工作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM