Что делает закрытие канала kotlinx.coroutines

Что делает закрытие канала kotlinx.coroutines с помощью channel.close() и каков будет негативный эффект, если каналы не будут закрыты вручную? Если я не закрою канал вручную, будет ли какая-то ненужная обработка? Будет ли где-нибудь ссылка на канал, которая не позволит ему быть GCd? Или функция закрытия просто существует как способ информирования потенциальных пользователей канала о том, что его больше нельзя использовать.

(Вопрос перенесен с форума Kotlin https://discuss.kotlinlang.org/t/closing-coroutine-channels/2549)


person Roman Elizarov    schedule 10.05.2017    source источник


Ответы (1)


Закрытие канала концептуально работает путем отправки специального «токена закрытия» по этому каналу. Вы закрываете канал, когда у вас есть конечная последовательность элементов, которые должны быть обработаны потребителями, и вы должны сигнализировать потребителям, что эта последовательность закончилась. В противном случае вам не нужно закрывать канал.

Каналы не привязаны к какому-либо нативному ресурсу, и их не нужно закрывать, чтобы освободить память. Достаточно просто удалить все ссылки на канал. GC придет, чтобы очистить его.

person Roman Elizarov    schedule 10.05.2017
comment
Что ж, вы можете привязать канал к ресурсу с помощью try/finally, как это сделал я для сканирования BLE в Android, поэтому в таких случаях вам следует использовать канал или отменить его вручную. - person Louis CAD; 09.06.2018
comment
Это также относится к SubscriptionReceiveChannels из BroadcastChannel или BroadcastChannel содержит ссылку на каждый SubscriptionReceiveChannel? Пытался просмотреть исходный код, но это только еще больше меня запутало, потому что я увидел, что происходит некоторое удаление SubscriptionReceiveChannel из массивов. Извините, если вопрос излишен, но я просто параноик по поводу утечек памяти. - person zjuhasz; 17.07.2018
comment
Это то же самое. Когда вы закрываете широковещательный канал, он передает соответствующий маркер закрытия всем своим подписчикам. - person Roman Elizarov; 17.07.2018