boost :: asio :: io_service занял длину очереди для таймеров и сообщений - PullRequest
11 голосов
/ 24 июля 2011

Я довольно новичок в boost :: asio, но я работаю над проектом, который существует уже несколько лет и широко использует asio.Мое текущее задание - добавлять периодические метрики о различных действиях системы.Одним из показателей является наблюдение за тем, насколько глубоко рабочие очереди boost :: asio :: io_service становятся и очереди таймеров в произвольный период времени выполнения.Поэтому мне нужно иметь возможность спросить объект: asio :: io_service, сколько вещей в его очередях.

Чтобы проиллюстрировать то, что я спрашиваю, рассмотрим следующее:

boost::asio::io_service asio_service;

asio_service.post( boost::bind( do_work, "eat" ) );
asio_service.post( boost::bind( do_work, "drink" ) );
asio_service.post( boost::bind( do_work, "and be merry!" ) );

std::cout << "There are " << asio_service.XXXX() 
          << "things in the post() queue and "
          << asio_service.YYYY() << " timers"

Есть ли способ с boost asio, чтобы получить функциональность, эквивалентную тому, что выражают мои вызовы "XXXX ()" и "YYYY ()"?

Я посмотрел код очереди таймера asio и увидел, что очередь на самом деле представляет собой вектор и список, но оба они являются закрытыми.Поскольку они являются частными, я не могу наследовать, чтобы получить доступ, и я не хочу, чтобы мне наследовали или писали какой-то нечетный шаблон посетителей, чтобы обернуть вещи для этой одной пары метрик: прямой доступ к этим подсчетам будетидеал;специальные версии boost, которые я взломал, чтобы дать мне доступ, не были бы идеальными: я ищу способ сделать это, который уже существует в boost.Надеюсь, я не первый, кто просит об этом.

1 Ответ

5 голосов
/ 24 июля 2011

Вы не можете получить статистику об очереди io_service без непосредственного изменения библиотеки asio. Как вы заметили, контейнер является приватным. Размер очереди на самом деле не очень важен, так как производительность или пропускная способность зависят от обработчиков завершения. В прошлом я пытался решить что-то похожее, чтобы измерить время, необходимое для публикации тривиального обработчика в io_service

void
Status::impl()
{
    const boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time();
    _io_service.post(
        boost::bind(
            &Status::loadHandler,
            this,
            start
        )
    );
}

void
Status::loadHandler(
    const boost::posix_time::ptime& start,
    )
{
    // calculate duration spent in reactor queue
    const boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time();
    const boost::posix_time::time_duration load = end - start;
}
...