我对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中的方法。希望我不是第一个要求这个的人。
答案 0 :(得分:5)
如果不直接修改asio库,则无法获取有关io_service
队列的统计信息。如您所知,容器是私有的。无论如何,队列的大小确实不是非常重要,因为性能或吞吐量取决于完成处理程序。我过去所做的解决类似事情的方法是测量将一个琐碎的处理程序发布到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;
}