C++如何實(shí)現(xiàn)線程安全的頻率限制器-創(chuàng)新互聯(lián)

小編這次要給大家分享的是C++如何實(shí)現(xiàn)線程安全的頻率限制器,文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的大新網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

很早以前,在學(xué)習(xí)使用 Python 的deque容器時(shí),我寫了一篇文章python3 deque 雙向隊(duì)列創(chuàng)建與使用方法分析。最近需要壓測(cè)線上服務(wù)的性能,又不愿意總是在 QA 那邊排隊(duì),于是需要自己寫一個(gè)壓測(cè)用的客戶端。其中一個(gè)核心需求就是要實(shí)現(xiàn) QPS 限制。

于是,終究逃不開要在 C++ 中實(shí)現(xiàn)一個(gè)線程安全的頻率限制器。

設(shè)計(jì)思路

所謂頻率限制,就是要在一個(gè)時(shí)間段(inteval)中,限制操作的次數(shù)(limit)。這又可以引出兩種強(qiáng)弱不同的表述:

  • 強(qiáng)表述:在任意一個(gè)長(zhǎng)度等于設(shè)定的時(shí)間段(interval)的滑動(dòng)窗口中,頻率限制器放行的操作次數(shù)(count)都不高于限制次數(shù)(limit)。
  • 弱表述:在一組長(zhǎng)度等于設(shè)定的時(shí)間段(interval)且緊密相連的固定窗口中,每一個(gè)窗口里頻率限制器放行的操作次數(shù)(count)都不高于限制次數(shù)(limit)。

不難發(fā)現(xiàn),強(qiáng)表述通過(guò)「滑動(dòng)窗口」的方式,不僅限制了頻率,還要求了操作在時(shí)間上的均勻性。前作的頻率限制器,實(shí)際上對(duì)應(yīng)了這里的強(qiáng)表述。但實(shí)際工程中,我們通常只需要實(shí)現(xiàn)弱表述的頻率限制器就足夠使用了。

對(duì)于弱表述,實(shí)現(xiàn)起來(lái)主要思路如下:

當(dāng)操作計(jì)數(shù)(count)小于限制(limit)時(shí)直接放行;

單線程實(shí)現(xiàn)

在不考慮線程安全時(shí),不難給出這樣的實(shí)現(xiàn)。

struct ms_clock {
 using rep = std::chrono::milliseconds::rep;
 using period = std::chrono::milliseconds::period;
 using duration = std::chrono::duration<rep, period>;
 using time_point = std::chrono::time_point<ms_clock, duration>;

 static
 time_point now() noexcept {
 return time_point(std::chrono::duration_cast<duration>(
   std::chrono::steady_clock::now().time_since_epoch()));
 }
};
} // namespace __details

class RateLimiter {
 public:
 using clock = __details::ms_clock; // 1.

 private:
 const uint64_t limit_;
 const clock::duration interval_;
 const clock::rep interval_count_;

 mutable uint64_t count_{std::numeric_limits<uint64_t>::max()}; // 2.a.
 mutable clock::rep timestamp_{0};     // 2.b.

 public:
 constexpr RateLimiter(uint64_t limit, clock::duration interval) :
 limit_(limit), interval_(interval), interval_count_(interval_.count()) {}

 RateLimiter(const RateLimiter&) = delete;  // 3.a.
 RateLimiter& operator=(const RateLimiter&) = delete; // 3.b.
 RateLimiter(RateLimiter&&) = delete;   // 3.c.
 RateLimiter& operator=(RateLimiter&&) = delete; // 3.d.

 bool operator()() const;
 double qps() const {
 return 1000.0 * this->limit_ / this->interval_count_;
 }
};

bool RateLimiter::operator()() const {
 auto orig_count = this->count_++;
 if (orig_count < this->limit_) { // 4.
 return true;
 } else {
 auto ts = this->timestamp_;
 auto now = clock::now().time_since_epoch().count();
 if (now - ts < this->interval_count_) { // 5.
 return false;
 }
 this->timestamp_ = now;
 this->count_ = 1;
 return true;
 }
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

文章名稱:C++如何實(shí)現(xiàn)線程安全的頻率限制器-創(chuàng)新互聯(lián)
分享鏈接:http://muchs.cn/article2/ddjiic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航微信小程序、ChatGPT、建站公司電子商務(wù)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)