Различия между буферной емкостью канала от нуля до единицы в Голанге - PullRequest
0 голосов
/ 17 ноября 2018

Я установил нулевой размер буфера канала, например var intChannelZero = make(chan int), когда получение значения из intChannelZero будет заблокировано, пока intChannelZero не получит значение.

Кроме того, я установил размер буфера канала равным единице, например var intChannelOne = make(chan int, 1), когда получение значения из intChannelOne будет заблокировано, пока intChannelOne не получит значение.

Мы знаем, что емкость intChannelZero равна нулю, емкость intChannelOne равна единице, поэтому я хочу знать:

  • При установке значения в intChannelZeroкак intChannelZero <- 1, где будет сохранено значение?
  • Различия между intChannelZero и intChannelOne при присвоении им значения.

Кто может объяснить это на уровне среды выполнения Голанга?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Разница между небуферизованными и буферизованными каналами будет равна

  1. Отправка на канал заблокирована
  2. Получение от канала заблокировано

Для небуферизованных каналов

Отправка будет заблокирована, если канал уже отправил сообщение и еще не был получен.

Получения будут заблокированы, если отправок не было.

Для буферизованных каналов

Отправка будет заблокирована, если уже n (размер канала) отправка произошла и ни одна из них не получена. т.е. весь размер канала был использован при отправке сообщений, но ничего не было получено.

Получения будут заблокированы, если буфер пуст, т.е. не имеет никаких неиспользованных отправок

Ошибки времени выполнения

Прием заблокированных выдает ошибку ниже

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:

Отправка заблокирована приведет к ошибке ниже

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
0 голосов
/ 17 ноября 2018

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

Если канал буферизован (емкость> = 1), то отправка будет успешной без блокировкиесли канал не заполнен и прием успешен без блокировки, если буфер не пустой.

При помещении значения в intChannelZero, например intChannelZero <- 1, где значение будет сохранено? </p>

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

Различия между intChannelZero и intChannelOne при присвоении им значения.

Отправка в intChannelZeroблокирует до получения получателя.

Отправка блоков intChannelOne до тех пор, пока в буфере не освободится место.

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