2015-12-02 75 views
1

假设我们有一个运行多个网络客户端的应用程序,它们构成一个循环:发送请求,然后暂停指定的时间,然后再次。使用许多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毫秒,更。

如何避免这种情况或如何重写程序,以便每个客户端都会等待给定的等待时间加上一些小的差异?

+0

@RichardHodges谢谢理查德,但问题不在于如何实现异步客户端和服务器。请在回答之前阅读问题。 – vladon

+0

不客气,但你不会得到任何超时没有异步解决方案;) –

+0

@RichardHodges我的代码是完全基于这些例子。它(定时器)在客户数量低时工作正常。但是,当客户数量很大(100+)时,他们会等待太久。你有一个答案如何实现这样的客户端超时?或者你可以指出具体的例子吗? – vladon

回答

0

只是不要等待定时器到期,但通过一个处理程序,当计时器到期时被调用。在ASIO应用程序中,唯一的阻止呼叫应该是io_service::run()

+0

如果使用处理程序将其更改为'timer.async_wait',结果是相同的。 – vladon

+0

我更改了有问题的代码。 – vladon

+0

你确定,你的服务器没有太多的CPU负载吗? –