Полируемый разрушитель

Я провел немало исследований, но пока не могу найти решение. Я хотел бы найти pollable ring buffer, аналогично LMAX disruptor один. У меня много издателей и один читатель.

Проблема с disruptoДело в том, что он использует собственный выделенный поток (пул) для чтения сообщений, но я хотел бы прочитать их из отдельного потока, который также выполняет другие функции.

Одна альтернатива, которую я вижу, состоит в том, чтобы использовать ManyToOneConcurrentArrayQueue от agrona или же MpscArrayQueue от jctools, Но ни одна из этих очередей preallocates объекты на пути LMAX disruptor делает. Когда я звоню ManyToOneConcurrentArrayQueue::offer или же MpscArrayQueue::offer Я передаю право собственности на объект в очередь, и когда я звоню ManyToOneConcurrentArrayQueue::poll или же MpscArrayQueue::poll Я беру на себя право собственности у них. Это проблема, так как это заставляет меня иметь отдельный пул объектов для переработки этих объектов, чтобы избежать создания мусора. Это явно медленнее, чем иметь preallocated array который всегда сохраняет право собственности на его содержимое (в виде RingBuffer в пакете LMAX disruptor).

Я бы не хотел изобретать велосипед и сам строить такую ​​структуру данных, но я не мог найти и существующую. Буду признателен за любую помощь, если кто-нибудь уже сталкивался с такой структурой.

2 ответа

Библиотека разрушителя включает класс EventPoller.

Можно было бы использовать реализацию RingBuffer разрушителей LMAX напрямую.

Потенциально используя другие части проекта без запуска разрушителя в целом.

Другие вопросы по тегам