Size: a a a

Kotlin Community

2020 April 17

AN

Alexander Nozik in Kotlin Community
Max Rovkin
Не понимаю, как это связано
Отмена родительского скоупа отменяет всех детей. Оно для этого и сделано. Если вы делаете отмену руками, то вы как-то совсем неправильно используете structured concurrency
источник

RE

Roman Elizarov in Kotlin Community
Любой вызов требует ресурсов. Вопрос не в том, что дороже. Вопрос в том, утекают ли ресурсы после того, как функция завершила работать или что-то остается. Запущенная корутина — это ресурс. Если функция завершилась, а после её завершения остались работать корутины, то это утечка, которая может привести к исчерпанию памяти.
источник

MR

Max Rovkin in Kotlin Community
Alexander Nozik
Отмена родительского скоупа отменяет всех детей. Оно для этого и сделано. Если вы делаете отмену руками, то вы как-то совсем неправильно используете structured concurrency
Это не должно вести к такому поведению, как я описал
источник

NY

Nikita Yatskivskiy in Kotlin Community
@relizarov секундочку, а почему память не кончается? https://pl.kotl.in/oPNLa0VG4
У нас же каждый раз новый скоуп создаётся? Или ресурсы вовремя освобождаются?
источник

MR

Max Rovkin in Kotlin Community
Alexander Nozik
А заем? Отменяете родителя и отмена детей происходит автоматически
Я вот так отменяю
unbindScope.coroutineContext[Job]?.cancelChildren()
destroyScope.coroutineContext[Job]?.cancelChildren()
источник

AN

Alexander Nozik in Kotlin Community
Max Rovkin
Я вот так отменяю
unbindScope.coroutineContext[Job]?.cancelChildren()
destroyScope.coroutineContext[Job]?.cancelChildren()
А почему не unbindScope.cancel()?
источник

RE

Roman Elizarov in Kotlin Community
Nikita Yatskivskiy
@relizarov секундочку, а почему память не кончается? https://pl.kotl.in/oPNLa0VG4
У нас же каждый раз новый скоуп создаётся? Или ресурсы вовремя освобождаются?
Потому-что, как я писал вышел, coroutineScope { ... } дает гарантию что после завершения функции ничего не утекло
источник

MR

Max Rovkin in Kotlin Community
Alexander Nozik
А почему не unbindScope.cancel()?
Да блин, с таким вызовом такое же поведение. Так что можно считать, что unbindScope.cancel()
источник

AN

Alexander Nozik in Kotlin Community
Max Rovkin
Да блин, с таким вызовом такое же поведение. Так что можно считать, что unbindScope.cancel()
Ручная отмена детей это в любом случае криво. Но я и не говорил, что ошибка у вас в этом. У вас где-то отмена во внешний мир утекает
источник

MR

Max Rovkin in Kotlin Community
Alexander Nozik
Ручная отмена детей это в любом случае криво. Но я и не говорил, что ошибка у вас в этом. У вас где-то отмена во внешний мир утекает
А можете описать подробнее? Чтобы я поискал, что не так сделал
источник

NY

Nikita Yatskivskiy in Kotlin Community
Roman Elizarov
Потому-что, как я писал вышел, coroutineScope { ... } дает гарантию что после завершения функции ничего не утекло
То есть правило такое:

Если мы хотим, чтобы после завершения функции у нас в памяти продолжала висеть корутина, например, с подиской на канал, то правильнее (с точки зрения api класса и избежания лишнего расхода памяти) передать сам скоуп в эту функции и оставить её как не-suspend.
Если мы хотим, чтобы по завершению нашей функции ресурсы сразу освободились, то правильнее (опять же с точки зрения api и избежания лишнего расхода памяти) пометить функцию как suspend, а уже внутри неё использовать coroutineContext { launch { } }.
источник

RE

Roman Elizarov in Kotlin Community
Да 👍
источник

NY

Nikita Yatskivskiy in Kotlin Community
👌спасибище)
источник

AN

Alexander Nozik in Kotlin Community
Max Rovkin
А можете описать подробнее? Чтобы я поискал, что не так сделал
Начать с чтения статей @relizarov
источник

Y

You in Kotlin Community
Alexander Nozik
Ручная отмена детей это в любом случае криво. Но я и не говорил, что ошибка у вас в этом. У вас где-то отмена во внешний мир утекает
Вне контекста это звучит как-то странно)
источник

MR

Max Rovkin in Kotlin Community
Alexander Nozik
Ручная отмена детей это в любом случае криво. Но я и не говорил, что ошибка у вас в этом. У вас где-то отмена во внешний мир утекает
именно такая отмена нужна, потому что после вызова cancel() в этом скоупе уже нельзя ничего запустить, а хотелось бы 🙂
источник

AN

Alexander Nozik in Kotlin Community
Max Rovkin
именно такая отмена нужна, потому что после вызова cancel() в этом скоупе уже нельзя ничего запустить, а хотелось бы 🙂
Что за ерунда? Почему нельзя дочерний скоуп создать?
источник

MR

Max Rovkin in Kotlin Community
не понимаю, как это поможет?
источник

AN

Alexander Nozik in Kotlin Community
Max Rovkin
не понимаю, как это поможет?
Вы делаете дочерний скоуп, заводите в нем все, что нужно. Потом, когда он не нужен, отменяете его.
источник

AN

Alexander Nozik in Kotlin Community
И все, гарантировано утечек нет, проблем нет
источник