2017-01-28 24 views
0

Я новичок в Go, и мне может не хватать точки, но почему каналы Go ограничены в максимальном буферизованном канале буферизации? Например, если я делаю канал как такПочему каналы каналов ограничивают размер буфера

channel := make(chan int, 100) 

я не могу добавить больше чем 100 элементов в канал без блокировки, есть причина для этого? Кроме того, они не могут динамически изменяться, потому что API канала не поддерживает это.

Это похоже на ограничение в поддержке языка для универсальной синхронизации с одним механизмом, поскольку ему не хватает удобства по сравнению с неограниченным семафором. Например, значение обобщенного семафора может быть увеличено без ограничений.

ответ

0

Размер буфера - это количество элементов, которые могут быть отправлены на канал без блокировки отправки. По умолчанию канал имеет размер буфера 0 (вы получаете это с make (chan int)). Это означает, что каждая посылка будет блокироваться до тех пор, пока другой канал не получит от канала. Канал размера буфера 1 не может содержать 1 элемент до отправки блоков, так что вы получите

c := make(chan int, 1) 
c <- 1 // doesn't block 
c <- 2 // blocks until another goroutine receives from the channel 

Я предлагаю вам посмотреть это для более разъяснений: https://rogpeppe.wordpress.com/2010/02/10/unlimited-buffering-with-low-overhead/ http://openmymind.net/Introduction-To-Go-Buffered-Channels/

+0

Я понимаю, как работают буферные каналы. Мой вопрос был больше о том, почему они были разработаны с ограниченным буфером, а не с буфером динамического размера. ИМО. Имеет смысл позволить им хранить неограниченные значения без блокировки при использовании буферизованных каналов – Curious

3

Если один компонент программы не может идти в ногу со своим входом, ему нужно оказывать давление на остальную часть системы, вместо того, чтобы позволить ей бежать вперед и генерировать гигабайты данных, которые никогда не будут обработаны, потому что у системы закончилась нехватка памяти и произошел сбой.

На самом деле нет такой вещи, как неограниченный буфер, поскольку машины имеют ограничения на то, что они могут обрабатывать. Go требует указать размер для буферизованных каналов, чтобы вы подумали о том, какой размер буфера вашей программы действительно нужен и может обрабатывать. Если на самом деле требуется миллиард элементов, и они могут справиться с ними, вы можете создать канал, большой. Но в большинстве случаев размер буфера 0 или 1 на самом деле является тем, что необходимо.