併發編程框架Disruptor實戰 - WaitStrategy消費者等待策略

生產者和消費者都可能出現速度過快,追上對方的情況,這個時候就需要等待了.等待過程中也會有不同的策略.

1 主要策略

當消費者等待在SequenceBarrier上時,有許多可選的等待策略,不同的等待策略在延遲和CPU資源的佔用上有所不同,可以視應用場景選擇:

1.1 BlockingWaitStrategy

生產者的默認策略是BlockingWaitStrategy,是在RingBuffer中確定的.但是生產者的默認實現MultiProducerSequencer沒有使用等待策略

  • 生產者是通過LockSupport.parkNanos(1);來等待的

MultiProducerSequencer#next(int n) 消費者的默認策略是 BatchEventProcessor的run方法

BatchEventProcessor#processEvents()

SequenceBarrier決定

Disruptor類中

Disruptor#createEventProcessors

SequenceBarrier是由ringBuffer決定的

看一看到最後是由sequencer來決定的

這裏的waitStrategy就是sequencerwaitStrategy 默認MultiProducerSequencer

MultiProducerSequencer的默認策略是BlockingWaitStrategy.

sequencer其實就是生產者,所以其實消費者的默認策略和生產者是一樣的.

這個策略的內部適用一個鎖和條件變量來控制線程的執行和等待(Java基本的同步方法)

最慢的等待策略,但也是CPU使用率最低和最穩定的選項

1.2 SleepingWaitStrategy

在多次循環嘗試不成功後,選擇讓出CPU,等待下次調度,多次調度後仍不成功,嘗試前睡眠一個納秒級別的時間再嘗試 這種策略平衡了延遲和CPU資源佔用,但延遲不均勻

1.3 無鎖高性能 YieldingWaitStrategy

在多次循環嘗試不成功後,選擇讓出CPU,等待下次調。平衡了延遲和CPU資源佔用,但延遲也比較均勻。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章