假设我们有一个运行多个网络客户端的应用程序,它们构成一个循环:发送请求,然后暂停指定的时间,然后再次。使用许多boost :: asio :: deadline_timer
示例(不是所有的代码):
#define WAIT_INTERVAL 1000
class client()
{
public:
explicit client(boost::asio::io_service & io_service)
: io_service_(io_service)
{
working_ = true;
};
run(boost::asio::yield_context t_yield)
{
while (working_) {
// async wait
boost::asio::deadline_timer timer(io_service_, boost::posix::milliseconds(WAIT_INTERVAL));
timer.async_wait(t_yield);
do_work();
}
};
private:
void do_work()
{
// make work
}
bool working_{ false };
boost::asio::io_service & io_service_;
}
class app()
{
public:
// code omitted
prepare(size_t number_of_clients)
{
clients_.reserve(number_of_clients);
for (size_t i = 0; i < number_of_clients; ++i)
{
clients_.emplace_back(io_service_);
}
}
run()
{
for (auto & client : clients_)
{
boost::asio::spawn(io_service_, [&client](boost::asio::yield_context t_yield)
{
client.run(t_yield);
});
}
}
private:
boost::asio::io_service io_service_;
std::vector<client> clients_;
}
的问题是:在运行时,许多客户端(如100左右)deadline_timer
实际上等待几秒钟,不近1000毫秒,但约9000毫秒,更。
如何避免这种情况或如何重写程序,以便每个客户端都会等待给定的等待时间加上一些小的差异?
@RichardHodges谢谢理查德,但问题不在于如何实现异步客户端和服务器。请在回答之前阅读问题。 – vladon
不客气,但你不会得到任何超时没有异步解决方案;) –
@RichardHodges我的代码是完全基于这些例子。它(定时器)在客户数量低时工作正常。但是,当客户数量很大(100+)时,他们会等待太久。你有一个答案如何实现这样的客户端超时?或者你可以指出具体的例子吗? – vladon