169 похожих чатов

Друзья, помогите, пожалуйста, понять суть работы с корутинами. Вот у

нас есть вызов саспенд фукции на 10-ой строке и есть несколько вопросов

1) Тк метод саспенд, то он требует, чтобы и вызывающая функция тоже была саспенд либо вызывался из корутины. Это просто прихоть разработчиков? Это ведь не андроид, где нужно делать ИО в отдельном потоке

2) Второй вопрос скорее уточнение и мое непонимание. На той же 10ой строке указывается, что метод саспенд, и я все время думал, этот метод и останавливает выполнение кода, отдавая возможность другим корутинам сработать в это время? Или оно саспендится когда угодно?

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

10 ответов

6 просмотров

1) suspend - это точка остановки, это не прихоть разработчиков, это маркер. 2) suspend останавливает выполнение корутины до конца выполнения функции 3) ответ во втором

Savva-Mirzoyan Автор вопроса
Vadym Yaroshchuk
1) suspend - это точка остановки, это не прихоть р...

1) я в том плане, зачем было обозначать метод саспенд, если его можно вызывать только из корутины, а обычную функцию когда угодно. Но ладно, это мелочь, спасибо 2) то есть если у меня есть условный метод foo() где внутри 3 саспенд функции, то функция foo "засаспендится" 3 раза на методах bar(), а простой код будет выполнять без установки? (код упрощен) fun foo() { var a = 42 bar1() a++ bar2() a++ bar3() a++ }

Savva Mirzoyan
1) я в том плане, зачем было обозначать метод сасп...

1) может потому-что он саспендит поток? А так будет только корутину? 2) нет, всё будет выполнятся последовательно (это не зависит от suspend / non-suspend функций), если вы там асинхронщину не сделаете

Savva-Mirzoyan Автор вопроса
Vadym Yaroshchuk
1) может потому-что он саспендит поток? А так буде...

2) то что оно будет последовательно я понял из предыдущего вашего ответа, а вот не могу понять когда именно определяется момент для саспенда корутины. Для логики приложения это не важно, но хотелось бы иметь полное представление

Savva-Mirzoyan Автор вопроса
Savva Mirzoyan
2) то что оно будет последовательно я понял из пре...

в функции для записи/чтения тоже есть код, который не работает конкретно с сетью/диском, а обычные циклы там, условия и тд

1. Почитайте про Continuation Passing Style 2. потом после прочтения нужно осмыслить что вызов саспенд функции, в некотором роде разрывает тело функции. и передает часть после suspend в виде так называемого Continuation отдельным параметром вглубь вызываемой функции. 3. в качестве упражнения предлагаю переписать код без suspend функций, а в явном виде переписать в стиле continuation passing style.

Savva-Mirzoyan Автор вопроса
Anton Lakotka
1. Почитайте про Continuation Passing Style 2. по...

ох ты божечки-кошечки, понял, спасибо за такую наводку, буду разбираться

Savva Mirzoyan
2) то что оно будет последовательно я понял из пре...

определяется тем, когда у вас длительная операция. Никто не мешает лонг-операцию делать не саспенд и вызывать из корутины. В общем я плохо объясняю, не думаю что смогу нормально объяснить. Это почти бесполезно если у вас всё в одном CoroutineContext (ну разве что обозначить, что операция лонгполл или что внутри есть саспенд функции). Лучший пример для этого можно подчерпать с ведра: fun ui() = withContext(Dispatchers.Main) { io() textView.setText("") } suspend fun io() = withContext(Dispatchers.IO) { delay(10000L) } В таком случае, Main диспатчер ждёт выполнения io функции на Dispatchers.IO и даёт возможность выполнятся где-то в другом месте. В консольных аппах типа вашего это почти бесполезно, но в случаях где есть UI / нужна синхронизация и так далее это удобно.

Для того, чтобы функцию возможно было приостановить, компилятор её перемалывает, превращая в конечный автомат. Под капотом эта функция получает дополнительный параметр и вызывается каждый раз, когда она логически продолжается после приостановки. Такое нельзя вызвать из любой функции, только из другого такого же автомата. Точкой входа в эту систему являются корутин билдеры (вот эти все ранблокинги, лончи и иже с ними). Так что это не прихоть разработчиков, это механика такая.

Savva Mirzoyan
1) я в том плане, зачем было обозначать метод сасп...

Приостановка будет сделана только в том случае, если она нужна. Это диспетчер решает. Оно может выполниться и без приостановки, единственное, в точках приостановки выполняется дополнительный код, помогающий поддерживать машинерию отмены корутин и всякое такое.

Похожие вопросы

Обсуждают сегодня

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Карта сайта