Возможно ли использовать буферный канал Go в качестве поточно-безопасной очереди?

Я хочу найти структуру очереди (контейнер данных), элементы которой должны быть первыми в первом порядке. Для меня важно, чтобы структура была потокобезопасной. Я собираюсь использовать этот контейнер данных как нечто вроде пула задач или пулов.

Я знаю, что буферный канал является потокобезопасным, но мне интересно, работает ли он как FIFO, особенно в параллельной ситуации.

И если можно использовать буферный канал в качестве поточно-безопасной очереди, мне нужно беспокоиться об эффективности?

Ответы

Ответ 1

Я уверен, что Каналы являются FIFO. Они также дешевы, поэтому они будут эффективными с точки зрения памяти. Помимо этого, не зная подробностей о том, как вы собираетесь их использовать, мы не можем дать больше советов.

Ответ 2

В Go буферный канал - это просто: потоковая FIFO-очередь с потоком, поэтому то, что вы пытаетесь сделать, совершенно справедливо. Вы не должны иметь проблем с производительностью при таком подходе.

Ответ 3

В общем, я бы сказал, что буферизованные каналы не создают хорошую concurrency -безопасную очередь. Создание их выделяет память для всего буфера. Если размер очереди варьируется от очень малого до очень большого во время выполнения, вам нужно выделить для наихудшего сценария и может тратить много памяти.