日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何使用Disruptor(二)從Ringbuffer讀取

從上一篇文章中我們都了解了什么是Ring Buffer以及它是如何的特別。但遺憾的是,我還沒有講述如何使用DisruptorRing Buffer寫數(shù)據(jù)和從Ring Buffer中讀取數(shù)據(jù)。

10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有新民免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

ConsumerBarrier與消費(fèi)者

這里我要稍微反過來介紹,因為總的來說讀取數(shù)據(jù)這一過程比寫數(shù)據(jù)要容易理解。假設(shè)通過一些“魔法”已經(jīng)把數(shù)據(jù)寫入到
Ring Buffer了,怎樣從
Ring Buffer讀出這些數(shù)據(jù)呢?

(好,我開始后悔使用Paint/Gimp 了。盡管這是個購買繪圖板的好借口,如果我繼續(xù)寫下去的話… UML界的權(quán)威們大概也在詛咒我的名字了。)

消費(fèi)者(Consumer)是一個想從Ring Buffer里讀取數(shù)據(jù)的線程,它可以訪問ConsumerBarrier對象——這個對象由RingBuffer創(chuàng)建并且代表消費(fèi)者與RingBuffer進(jìn)行交互。就像Ring Buffer顯然需要一個序號才能找到下一個可用節(jié)點(diǎn)一樣,消費(fèi)者也需要知道它將要處理的序號——每個消費(fèi)者都需要找到下一個它要訪問的序號。在上面的例子中,消費(fèi)者處理完了Ring Buffer里序號8之前(包括8)的所有數(shù)據(jù),那么它期待訪問的下一個序號是9。

消費(fèi)者可以調(diào)用ConsumerBarrier對象的waitFor()方法,傳遞它所需要的下一個序號.

1final long availableSeq = consumerBarrier.waitFor(nextSequence);

ConsumerBarrier返回RingBuffer的最大可訪問序號——在上面的例子中是12。ConsumerBarrier有一個WaitStrategy方法來決定它如何等待這個序號,我現(xiàn)在不會去描述它的細(xì)節(jié),代碼的注釋里已經(jīng)概括了每一種WaitStrategy的優(yōu)點(diǎn)和缺點(diǎn) 。

接下來怎么做?

接下來,消費(fèi)者會一直原地停留,等待更多數(shù)據(jù)被寫入Ring Buffer。并且,一旦數(shù)據(jù)寫入后消費(fèi)者會收到通知——節(jié)點(diǎn)910,1112 已寫入。現(xiàn)在序號12到了,消費(fèi)者可以讓ConsumerBarrier去拿這些序號節(jié)點(diǎn)里的數(shù)據(jù)了。

拿到了數(shù)據(jù)后,消費(fèi)者(Consumer)會更新自己的標(biāo)識(cursor)。

你應(yīng)該已經(jīng)感覺得到,這樣做是怎樣有助于平緩延遲的峰值了——以前需要逐個節(jié)點(diǎn)地詢問“我可以拿下一個數(shù)據(jù)嗎?現(xiàn)在可以了么?現(xiàn)在呢?”,消費(fèi)者(Consumer)現(xiàn)在只需要簡單的說“當(dāng)你拿到的數(shù)字比我這個要大的時候請告訴我”,函數(shù)返回值會告訴它有多少個新的節(jié)點(diǎn)可以讀取數(shù)據(jù)了。因為這些新的節(jié)點(diǎn)的確已經(jīng)寫入了數(shù)據(jù)(Ring Buffer本身的序號已經(jīng)更新),而且消費(fèi)者對這些節(jié)點(diǎn)的唯一操作是讀而不是寫,因此訪問不用加鎖。這太好了,不僅代碼實現(xiàn)起來可以更加安全和簡單,而且不用加鎖使得速度更快。

另一個好處是——你可以用多個消費(fèi)者(Consumer)去讀同一個RingBuffer ,不需要加鎖,也不需要用另外的隊列來協(xié)調(diào)不同的線程(消費(fèi)者)。這樣你可以在Disruptor的協(xié)調(diào)下實現(xiàn)真正的并發(fā)數(shù)據(jù)處理。

BatchConsumer代碼是一個消費(fèi)者的例子。如果你實現(xiàn)了BatchHandler, 你可以用BatchConsumer來完成上面我提到的復(fù)雜工作。它很容易對付那些需要成批處理的節(jié)點(diǎn)(例如上文中要處理的9-12節(jié)點(diǎn))而不用單獨(dú)地去讀取每一個節(jié)點(diǎn)。

更新:注意Disruptor 2.0版本使用了與本文不一樣的命名。如果你對類名感到困惑,請閱讀我的變更總結(jié)。

原文鏈接:http://ifeve.com/dissecting-the-disruptor-how-do-i-read-from-the-ring-buffer/

譯文鏈接:http://ifeve.com/dissecting_the_disruptor_how_doi_read_from_the_ring_buffer/


當(dāng)前名稱:如何使用Disruptor(二)從Ringbuffer讀取
文章出自:http://www.dlmjj.cn/article/dpidocs.html