#2 CoroutineContext. Настраиваем корутины || Курс по корутинам

Поділитися
Вставка
  • Опубліковано 13 лип 2024
  • Как задать различные параметры для корутины. Что такое CoroutineContext. Как переключить потоки в корутине.
    Курс создан при поддержке компании Revolut. Вакансии компании здесь bit.ly/3LGwJ8t
    Автор - Кирилл Розов, Android разработчик 10 лет опыта в разработке
    🔗 Каналы "Android Broadcast" taplink.cc/android_broadcast
    🔗 Поддержать проект taplink.cc/android_broadcast/...
    🔗 Coroutine Context kotlinlang.org/docs/coroutine...
    #androiddev #android #программирование #kotlin #КириллРозов #андроид #AndroidBroadcast
    0:00 Вступление
    0:20 Что такое CoroutineContext
    1:40 Job. Представление корутины в объекте
    4:00 Dispatcher. Управление потоком выполнения
    6:30 Как правильно доставить Dispatcher
    7:08 CoroutineExceptionHandler
    7:59 CoroutineName
    8:33 Заключение
    8:50 Q&A

КОМЕНТАРІ • 71

  • @AndroidBroadcast
    @AndroidBroadcast  2 роки тому

    💰 Поддержать проект на Boosty boosty.to/androidbroadcast
    🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast
    🔗 Telegram канал "Kotlin Broadcast" ttttt.me/android_broadcast

  • @vladislavaliev2894
    @vladislavaliev2894 2 роки тому +18

    Кирилл, спасибо за годноту и за вклад в community! Ты делаешь этот мир лучше)

  • @danzolax6885
    @danzolax6885 2 роки тому +13

    Лучший утренний контент перед работой)

  • @zoompartyru
    @zoompartyru 2 роки тому +2

    Кирилл, спасибо за отличный контент по kotlin coroutines!

  • @A-pe5yy
    @A-pe5yy 2 роки тому

    Спасибо за материал!

  • @Mostwonted7
    @Mostwonted7 Рік тому

    Спасибо за знания) успехов тебе)

  • @lordraiden_do
    @lordraiden_do 2 роки тому

    Лучший контент в утро субботы!

  • @user-by1id2ix4h
    @user-by1id2ix4h 2 роки тому +13

    Кирилл, спасибо за шикарный контент
    Коротко и без воды, шикарный формат
    А кому что-то не понятно - гугл в помощь)
    Если бы автор рассказывал о каждой мелочи - то видео бы получилось очень длинным и не охватило бы такую широкую аудиторию, которую охватывает сейчас
    Так как для тех, кто, что-то знает по корутинам - было бы много воды

  • @evgeniybutov2792
    @evgeniybutov2792 2 роки тому

    Кирилл, спасибо, полезно, интересно ;)

  • @microdevices
    @microdevices 2 роки тому

    Кратко и по существу

  • @KekLolChill
    @KekLolChill 2 роки тому

    Балдежный курс

  • @mikeshilovski1512
    @mikeshilovski1512 2 роки тому +15

    Я уже разбираюсь в корутинах, но мне кажется если бы до этого с корутинами не работал было бы сложно все это понять, даже после rx

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +5

      Я сам их не понял с первого раза и не думаю что такую концепцию легко сразу понять с первого раза

  • @kickout367
    @kickout367 2 роки тому

    Ну тогда ждем урок еще завтра)))

  • @user-ol2jd2tl7m
    @user-ol2jd2tl7m 10 місяців тому

    Спасибо

  • @SerhiyRadkivskyi
    @SerhiyRadkivskyi 2 роки тому +7

    Вот рекомендую отличный мини курс молодого бойца по корутинам, уверен его можно еще даже расширить и дополнить примерами:
    ua-cam.com/play/PLQkwcJG4YTCQcFEPuYGuv54nYai_lwil_.html

    • @A-pe5yy
      @A-pe5yy 2 роки тому +1

      спасибо!👍

  • @speedrages
    @speedrages 2 роки тому +2

    Да, присоединюсь. Супер подача, коротко и не напряжно. Вопрос от новичка. Как практиковаться в этом? С чего начать практику? Как именно ты начинал практиковаться. Именно начинал.
    Смотрю разные источники, везде много теории и элементарные примеры, но хотелось бы примеров посложнее, причем с нарастающим уровнем сложности. Буду рад получить ответ, но даже если не получу, все равно продолжу смотреть тебя👍

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +1

      Я практиковался уже с опытом в разработке, так что просто взял pet проект или начал писать его чтобы попробовать технологию. + повезло что на работе смог затащить корутины даже в альфа версии в 2017

    • @speedrages
      @speedrages 2 роки тому

      @@AndroidBroadcast посоветуете как начать практику без опыта, если есть представление как это сделать?

    • @UUU161
      @UUU161 Рік тому

      @@speedrages если ты серьезно задаешь такие вопросы, то лучше и не начинать

  • @user-eu6tc6zz5v
    @user-eu6tc6zz5v 2 роки тому +2

    Кирилл, ты случайно не оговорился на 4:55, когда сказал, что в пуле потоков IO количество потоков не менее 64? Другие источники говорят "не БОЛЕЕ 64".
    Присоединяюсь к благодарностям за чертовски годный курс по корутинам!

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Можно посмотреть формулу в исходниках. Для IO максимальный размер пулла очень большой, но все эти потоки создаются по необходимости

  • @arturmorozov4075
    @arturmorozov4075 2 роки тому +1

    Кирилл, спасибо за видео!
    На 3:33 кажется не совсем корректная инфа - родитель у которого SupervisorJob не отменяется ведь сам при ошибке в дочерней корутине

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +1

      Верно. Надо будет поправить

  • @user-eg1vb9fn5g
    @user-eg1vb9fn5g 2 роки тому +3

    Отличное начало курса, в голове прям щелкает от понимания 😄
    Отсюда у меня возник вопрос: можно ли указать саспенд функции, что она должна быть запущена в определенном диспатчере? Я видел вариант, что тело функции можно обернуть в нужный withContext, но не хотелось бы лишний раз переключаться

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +2

      Тот способ через withContext и есть который используется для вызова функции в необходимом контексте, другого пути я не видел

    • @artyoms5186
      @artyoms5186 2 роки тому

      Я так понимаю, что withContext и есть рекомендуемый подход, плюс вообще все функции лучше проектировать main-safe, что если функция может заблочить main поток, ей нужно самой переключить контекст на всякий случай

  • @nadzeyakondrat184
    @nadzeyakondrat184 2 роки тому

    Привет
    Спасибо за курс.
    Воспрос: может ли входить main-поток в пул потоков Default dispatcher?

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Нет, в том то и суть чтобы разгрузить главный поток

  • @alexpro8317
    @alexpro8317 2 роки тому +1

    На счёт оберток для провайда диспетчеров, мы отказались от этой штуки, т.к. появилась возможность в тестах напрямую сетить диспетчер в класс Dispatchers. Тесты от этого никак не пострадали, а куча классов убрала лишнюю зависимость, которая больше мозолила глаза

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Сетать напрямую можно только Main Dispatcher, или я что-то упустил в обновлениях?

  • @user-gc9rm5yo1y
    @user-gc9rm5yo1y Рік тому

    Спасибо огромное за серию видео. Материал немного сложный, пересматриваю повторно.
    Вопрос что будет если использовать Default dispatcher с IO операциями? Если при этом Default пул потоков загружен сложной математикой, то часть ядер процессора будут недозагружены?

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому

      Default и IO настроены с учётом специфики такого рода операций, если вы выберите неправильно -ничего страшного нет

  • @Nerubianify
    @Nerubianify 2 роки тому +1

    Спасибо! По поводу ссылки на енам, не увидел в описании(

  • @RebootSMR
    @RebootSMR 2 роки тому

    В курсе будет какое-нибудь (например, итоговое) видео с разбором того, во что компилятор преобразовывает корутину и как она под капотом работает?

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Нет

    • @RebootSMR
      @RebootSMR 2 роки тому +1

      @@AndroidBroadcast спасибо за ответ) а мне на работе уже пару коллег советовали извучить данный вопрос

  • @andreyterehin9188
    @andreyterehin9188 2 роки тому

    Благодарю за этот курс! Круто
    Подскажите пожалуйста какой контекст нужно использовать в CoroutineScope для работы с базой , когда корутина что-то вытаскивает из Room ?
    У меня, например val coroutineScope = CoroutineScope(Dispatchers.Default), но не уверен, что это правильно

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +1

      Лучше взять IO, так как БД - это чтение/запись с/на диск

    • @BelokonRoman
      @BelokonRoman 2 роки тому +7

      Если в Dao у метода прописать suspend, то запросы будут выполнятся на Room-овском Dispatcher-е и не надо использовать какой то другой диспатчер. Такое же поведение и у Retrofit-a

    • @user-eh2jg6oh5b
      @user-eh2jg6oh5b Рік тому

      @@BelokonRoman , а с Realm такое возможно?

    • @BelokonRoman
      @BelokonRoman Рік тому

      @@user-eh2jg6oh5b не знаю, я с Realm не работаю.

  • @user-eu3ln9ys9y
    @user-eu3ln9ys9y 2 роки тому

    Привет
    Я правильно понимаю, что пул потоков, при использовании Dispatcher.IO состоит из нативныех потоков (которых ещё 64)?
    Буду очень благодарен за ответ, давно не могу разобраться в этом простом вопросе

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      64 - это максимум. Потоком создаются отложенно по необходимости

  • @alexpro8317
    @alexpro8317 2 роки тому

    Ещё не хватило инфы про переключение контекста с помощью withContext) о его плюсах и минусах

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +3

      Оно будет в следующем видео

  • @mukhtarbimurat5106
    @mukhtarbimurat5106 2 роки тому

    спасибо за крутой контент.
    Одно не понял:
    Зачем нужен лишние потоки (64 потоков) для io если у нас 8 процессоров (кажется 8 потоков достаточна)? Вед корутины (в отличий от обычных потоков) освобождают свой поток при блокирующем вызове (например запрос в сеть). То есть потоки никогда не будут в wait состояние и нет необходимости для context switch

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Для того чтобы так происходило, I/O должен быть тоже suspend, но пока он только блокирующий (

    • @mukhtarbimurat5106
      @mukhtarbimurat5106 2 роки тому +1

      @@AndroidBroadcast то есть сейчас при io запросах (в отличий от delay() допустим) поток не освобождается? Или я чето не понял? В первом видео вроде в обратном говорили: что несколько корутин могут в отдом потоке выполнятся

  • @SpinQuarK26
    @SpinQuarK26 2 роки тому

    Почему вы советуете не использовать Dispatchers напрямую, а закидывать их обёртку через DI? Я пользуюсь ими напрямую, не могу вспомнить, чтобы возникали проблемы с этим

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Проблем нет, но вот в тестах из удобнее подменять

  • @user-ip5nu2uc4z
    @user-ip5nu2uc4z 9 місяців тому

    Кирилл, можете пояснить один момент? Функция Join приостанавливает коррутину пока job'а не выполниться(Suspends the coroutine until this job is complete. ) Если Job это абстракция над коррутингой, то как она может выполняться с приостановленной корутиной? В некоторых статьях вижу такую формулировку "Например, его метод join() позволяет ожидать, пока корутина не завершится"

    • @AndroidBroadcast
      @AndroidBroadcast  9 місяців тому +2

      При создание корутины через launch или async вы получаете объект Job, который и представляет её. join() - это suspend функция, которая приостановит корутину в которой была вызвана, до тех пор пока не будет выполнена Job (корутина) у которой вызвали join()

  • @user-not_defined
    @user-not_defined 2 роки тому

    Что значит интенсивно вычислительных операций? main же главный поток вроде

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +1

      Главный поток больше служит как координатор и гарант последовательного вызова. Например, работа с UI, запуск асинхронных операций на других потоках и применение их результата, системные вызовы. Этот потом должен быть загружен как можно меньше, так как в него попадают все взаимодействия пользователя с экраном

  • @dmitriymitroshin7525
    @dmitriymitroshin7525 2 роки тому +1

    Комментарий.

  • @Chernov1984
    @Chernov1984 2 роки тому

    +

  • @andreyliashuk2516
    @andreyliashuk2516 2 роки тому +1

    Я где-то давно читал, что IO dispatcher умеет только расширяться, но не умеет утилизировать ненужные потоки.
    Ты не знаешь, они уже это поправили или так и осталось?

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Без понятия такой подробности. Но каждый раз уничтожать потоки и убивать их невыгодно, так что такое поведение оправдано

    • @andreyliashuk2516
      @andreyliashuk2516 2 роки тому

      @@AndroidBroadcast Тут проблема, что если во время каких-то нагрузок количество потоков сильно увеличится(например до 40), то потом они будут простаивать. Думаю именно по этому и создали limitedParallelism.

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +1

      Да, там его и в Changelog так и объяснили

  • @s.a.3408
    @s.a.3408 Рік тому

    В IO количество потоков равно количеству ядер процессора, но не меньше 64х?
    Т.е. всегда не меньше 64х?
    Потому что я не знаю SOC, в котором есть столько ядер)
    Upd.
    Разобрался в вопросе. На самом деле, по умолчанию в IO НЕ БОЛЬШЕ 64х потоков.

  • @user-hu8uw3fr6m
    @user-hu8uw3fr6m Рік тому

    Очень красивое лицо, но лучше было бы смотреть на код, который мелькает не понятно для чего.
    Речь лучше не как на рынке при навязывании товара, а помедленнее, если, конечно же, это разъяснение для новичков, а не хвастаство перед равными.

  • @konstantinchernyaev3011
    @konstantinchernyaev3011 2 роки тому +1

    2:53 2 и 4 одинаковые вроде

  • @maksbragin
    @maksbragin 2 роки тому +10

    Как всегда, поверхностно, без объяснения. Тем, кому это действительно важно и они хотят понять, здесь делать нечего. Элементарный пример, ИО, ИО... Не все кто хочет разобраться с корутинами знают, что это абревиатура InputOutput и для чего этот поток. В общем как и с даггером, контент ради контента, а не для людей...

    • @maksbragin
      @maksbragin 2 роки тому +2

      Коммент не критики ради, просто хочется действительно толкового объяснения, а не просто пересказ доки.

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +4

      Ещё раз - это контент не для новичков, а уже понимающих профессию. Пишите вопросы и я сделаю доп разбор со всеми пояснениями. Знаете как сделать лучше, покажите мне своим примерос

    • @SerhiyRadkivskyi
      @SerhiyRadkivskyi 2 роки тому +1

      Вот рекомендую отличный мини курс молодого бойца по корутинам, уверен его можно еще даже расширить и дополнить примерами:
      ua-cam.com/play/PLQkwcJG4YTCQcFEPuYGuv54nYai_lwil_.html