Kotlin Разница в использовании каналов между отправкой и предложением - PullRequest
1 голос
/ 28 мая 2020

Каналы имеют две функции, которые позволяют нам отправлять в них события. Send и offer.

Я хотел бы лучше понять разницу между ними.

У меня есть некоторые утверждения, которые я хочу проверить, верны.

  • Send - функция приостановки. Что заставит мой код (а не поток) ждать, пока он завершится sh. Таким образом, он продолжает работать после завершения / отмены события внутри send. ИЛИ оно будет приостановлено только до тех пор, пока я не поставлю событие в очередь / не получу его?
  • Это означает, что если я использую send с одного канала на другой, первый канал будет заблокирован до тех пор, пока второй не сможет получить / queue?
  • Если у меня есть канал Rendezvous , и он уже что-то запускает (например, при приостановке, ожидающий API), а я offer новый четный. Это вызовет исключение offer? Причина, по которой канал не принимает?

Если вы знаете какое-либо другое основное отличие, я был бы рад узнать.

Заранее спасибо

1 Ответ

3 голосов
/ 28 мая 2020

send приостанавливает сопрограмму, из которой она вызывается, пока канал, на который отправляется, заполнен.

send не отправляет с одного канала на еще один. Когда вы вызываете send, вы отправляете элемент на канал. Затем канал ожидает, что другой блок кода вызовет receive из другой сопрограммы.

В RendezvousChannel емкость составляет 0. Это означает, что send всегда приостанавливает ожидание вызова receive от другой сопрограммы. Если вы вызвали send на RendezvousChannel, а затем использовали offer, offer не вызовет исключения (это произойдет только в том случае, если канал закрыт), а вернет false, если балансировка receive не вызывалась на RendezvousChannel после вашего начального send. Это связано с тем, что offer пытается немедленно добавить элемент в канал, если он не нарушает его ограничения пропускной способности.

...