Lock free ring buffer
Это репозиторий, в котором представлена реализация lock-free кольцевого буфера на Golang.
Более подробную информацию об этой реализации можно найти в моём блоге (https://lenshood.github.io/2021/04/19/lock-free-ring-buffer/#more).
Ниже представлен API и способы его использования:
type RingBuffer interface {
Offer(interface{}) (success bool)
Poll() (value interface{}, success bool)
SingleProducerOffer(valueSupplier func() (v interface{}, finish bool))
SingleConsumerPoll(valueConsumer func(interface{}))
}
Как правило, мы можем просто вызывать Offer()
и Poll()
для использования этого буфера как обычной очереди. Допустимы любые типы, но для эффективности использования памяти лучше передавать кольцевой буфер по указателю, чтобы избежать сборки мусора во время чтения/записи.
Мы можем создать его следующим образом:
import (
lfring "github.com/LENSHOOD/go-lock-free-ring-buffer"
)
buffer := lfring.New(lfring.Classical, 16)
Первый аргумент функции New()
— это тип кольцевого буфера. В настоящее время я предоставляю две реализации, они обе имеют одинаковое поведение, но бенчмарк показывает, что «NodeBased» имеет лучшую производительность.
Второй аргумент — capacity
, который определяет размер кольцевого буфера (единица измерения — количество слотов).
Есть два других метода, которые вы можете заметить в API:
SingleProducerOffer()
;SingleConsumerPoll()
.Эти два метода предназначены для двух особых случаев: много производителей и один потребитель, а также один производитель и много потребителей.
Когда сценарий использования — mpsc или spmc, использование такого метода «может» улучшить производительность передачи данных, поскольку в этих сценариях мы можем безопасно отказаться от некоторых тяжёлых операций.
Однако тест производительности (в моём блоге) показывает, что SingleConsumerPoll()
действительно улучшает производительность mpsc примерно в 1,4 раза, но SingleProducerOffer()
становится медленнее при использовании spmc.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )