Size: a a a

Kotlin Community

2020 April 08

NY

Nikita Yatskivskiy in Kotlin Community
Так
А если канал не закрывать? Который мы открыли через openSubscription(). А просто закрыть скоуп. В таком случае consumeEach продолжит выполнение?)
private val someChannel = BroadcastChannel<String>(1)

someScope.launch {
  someChannel.openSubscription().consumeEach { print(it) }
}

someScope.cancel()
источник

VP

Vladimir Petrakovich in Kotlin Community
Nikita Yatskivskiy
Так
А если канал не закрывать? Который мы открыли через openSubscription(). А просто закрыть скоуп. В таком случае consumeEach продолжит выполнение?)
private val someChannel = BroadcastChannel<String>(1)

someScope.launch {
  someChannel.openSubscription().consumeEach { print(it) }
}

someScope.cancel()
Из consumeEach вылетит CancellationException и всё закроется
источник

AN

Alexander Nozik in Kotlin Community
По идее если джоб отменить, то, все суспендное, что в нем отменится. В том числе consumEach, но вот закроется подписка или нет, не так очевидно. Почти уверен, что закроется
источник

VP

Vladimir Petrakovich in Kotlin Community
Если между openSubscription() и consumeEach() не выполнять кода, который может выбросить исключение, всё будет безопасно
источник

NY

Nikita Yatskivskiy in Kotlin Community
То есть, и канал cancel'ить смысла, в таком случае, нет? Я про канал, открытый через openSubscription(). Если gc до него может добраться. Ведь ссылок нет на него. Да и, закрыв скоуп, мы от него отписались.

Или я ошибаюсь?
источник

NY

Nikita Yatskivskiy in Kotlin Community
А, я понял
Он же у BroadcastChannel будет наверное где-то значится как ресивер. И тот продолжит ему события слать.
источник

NY

Nikita Yatskivskiy in Kotlin Community
🤯
источник

VP

Vladimir Petrakovich in Kotlin Community
Nikita Yatskivskiy
То есть, и канал cancel'ить смысла, в таком случае, нет? Я про канал, открытый через openSubscription(). Если gc до него может добраться. Ведь ссылок нет на него. Да и, закрыв скоуп, мы от него отписались.

Или я ошибаюсь?
В общем случае на это не стоит рассчитывать, всё закрываемое должно быть закрыто. consumeEach сделает это за вас.
источник

NY

Nikita Yatskivskiy in Kotlin Community
Vladimir Petrakovich
В общем случае на это не стоит рассчитывать, всё закрываемое должно быть закрыто. consumeEach сделает это за вас.
> consumeEach сделает это за вас

Имеете ввиду, когда в канале события закончатся?
источник

NY

Nikita Yatskivskiy in Kotlin Community
https://medium.com/swlh/how-can-we-use-coroutinescopes-in-kotlin-2210695f0e89

There is a handy extension function on a Channel called consumeEach. This function consumes and then closes the channel. When the consumeEach resumes, either normally, by cancelation or through some exception, we can be assured that the producer has ended as well and the channel has been closed. See the modified code below:
01.
...
10. val consumerScope: CoroutineScope = ...
11. val consumer = consumerScope.launch {
12.     counterChannel.consumeEach { counter ->
13.         ...
14.     }
15. }
...
When the consumerScope is canceled in the modified example, the consumeEach will close the counterChannel and the producer will be canceled as well. Hooray!
источник

NY

Nikita Yatskivskiy in Kotlin Community
Тут пишут, что канал закроется в таком случае. И руками его в итоге кенселить не надо. 🤯
источник

VP

Vladimir Petrakovich in Kotlin Community
Nikita Yatskivskiy
> consumeEach сделает это за вас

Имеете ввиду, когда в канале события закончатся?
Я имею в виду в любом случае
источник

NY

Nikita Yatskivskiy in Kotlin Community
Давайте срезюмируем) В голове путаница)

Итого:
Если consumeEach у объекта канала channelA вызван внутри корутины, исполняющейся в скоупе scopeA, то закрытие scopeA приводит к закрытию канала channelA (аналогично вызову cancel() у канала channelA). И в consumeEach более никаких сообщений из канала channelA не поступает.

Всё так?)
источник

VP

Vladimir Petrakovich in Kotlin Community
Nikita Yatskivskiy
Давайте срезюмируем) В голове путаница)

Итого:
Если consumeEach у объекта канала channelA вызван внутри корутины, исполняющейся в скоупе scopeA, то закрытие scopeA приводит к закрытию канала channelA (аналогично вызову cancel() у канала channelA). И в consumeEach более никаких сообщений из канала channelA не поступает.

Всё так?)
Лучше сделать такой вывод: consumeEach закрывает канал после завершения, в т.ч. при отмене корутины.
источник

NY

Nikita Yatskivskiy in Kotlin Community
🔥
Разобрался)
Спасибо)
источник

I

Ivan P. in Kotlin Community
Всем привет! Вопрос связан с веб сервером на kotlin. Недавно обнаружил http4k, которая по бенчмарку обходит ktor и в некоторых случаях fasthttp. Кто как думает, насколько надежно его использовать в продакшене и если есть выбор http4k, ktor, fasthttp (go), кто что выберет и почему? Спасибо)
источник

I

Ivan P. in Kotlin Community
Для высоконагруженных систем
источник

AL

Anton Lakotka in Kotlin Community
прям ктора не хватает?
источник

I

Ivan P. in Kotlin Community
Я смотрел бенчмарк, судя по нему ктор проиграывает http4k и fasthttp
источник

I

Ivan P. in Kotlin Community
Сам не использовал, может есть у кого практический опыт
источник