1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/thoughtworks-go-lock-free-ring-buffer

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.MD

Lock free ring buffer

Это репозиторий, в котором представлена реализация lock-free кольцевого буфера на Golang.

Более подробную информацию об этой реализации можно найти в моём блоге (https://lenshood.github.io/2021/04/19/lock-free-ring-buffer/#more).

API

Ниже представлен 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.

Производительность

  1. Два типа lock-free кольцевых буферов сравниваются с go-channel при разной ёмкости
  2. Два типа lock-free кольцевых буферов сравниваются с go-channel при разном соотношении производителей / потребителей
  3. Два типа lock-free кольцевых буферов сравниваются с go-channel при разных потоках

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Лок-фри ринг буфер бай голанг. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/thoughtworks-go-lock-free-ring-buffer.git
git@api.gitlife.ru:oschina-mirror/thoughtworks-go-lock-free-ring-buffer.git
oschina-mirror
thoughtworks-go-lock-free-ring-buffer
thoughtworks-go-lock-free-ring-buffer
master