Разница в использовании каналов Kotlin между Send и Offer

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

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

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

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

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

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


person Canato    schedule 28.05.2020    source источник


Ответы (1)


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

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

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

person alediaferia    schedule 28.05.2020
comment
Это то, что меня смущает Throws an exception if the channel [is closed for send][isClosedForSend] (see [close] for details)., если нет получателя и что-то уже пытается войти (отправка приостановлена), будет ли канал closeForSend? Спасибо. И извините за повторный вопрос, я хочу принести док-слова - person Canato; 29.05.2020
comment
Как видно из docs: возвращает true, если этот канал был закрыт вызовом close. Заполненный канал не закрывается для отправки. - person alediaferia; 29.05.2020