BlockingQueue - один производитель, несколько потребителей - PullRequest
1 голос
/ 08 марта 2020

У меня три темы. Поток 1 (T1) является производителем, который генерирует данные. Каждый из потоков 2 и 3 (соответственно T2, T3) ожидает обработки данных T1 в отдельных циклах. Я думаю о том, чтобы разделить BlockingQueue между потоками и заставить T2 и T3 ждать, вызвав «take».

docs для java .util.concurrent.BlockingQueue говорят, что это может «безопасно использовать с несколькими производителями и несколькими потребителями». При тестировании примера из документации кажется, что поведение состоит в том, чтобы позволить одному потребителю «взять» объект «положить» вместо того, чтобы все они его получили. Таким образом, T2 или T3 получают данные, и кажется, что они чередуются. Я хотел бы, чтобы они оба получали одинаковые данные, когда T1 помещает некоторые данные.

Мой вопрос, является ли BlockingQueue верным путем к go? Должен ли я думать об этой проблеме по-другому?

1 Ответ

1 голос
/ 08 марта 2020

Похоже на Publi sh -Подписать , вы публикуете sh данные в topi c, и все зарегистрированные потребители получают копию сообщения. Напротив, очередь доставляет сообщение только одному зарегистрированному потребителю. Я рекомендую вам пересмотреть описание этого компонента.

Реализация BlockingQueue, в сущности, Queue, как следует из названия, представляет собой очередь, которая позволяет добавлять и проверять объекты. Эти операции являются поточно-ориентированными, что означает, что, например, никакие два потока не получают один и тот же объект при проверке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...