假設我們有一個運行多個網絡客戶端的應用程序,它們構成一個循環:發送請求,然後暫停指定的時間,然後再次。使用許多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