2015-12-02 88 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負載嗎? –