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

Подскажите плз по корутинам. Есть 2 http клиента, которые делают

запросы на два различных ресурса: callResource1(), callResource2().

Есть сервисный метод, который вызывает два метода внутри себя: ждёт выполнения callResource1() и передаёт результат выполнения в callResource2(), а потом возвращает результат.

Если я помечаю два метода как suspend и внутри сервисного метода делаю launchWithContext(IO), то гарантируется ли порядок выполнения (ex happens before)? Будет ли барьер синхронизации?

Грубо говоря, может ли вызваться сначала callResource2(), а потом callResource1()?

6 ответов

11 просмотров

Не знаю что за launchWithContext, но в вашем кейсе достаточно внутри корутины вызывать последовательно эти методы, при необходимости меняя контекст через withContext

Если у вас написано в сервисном методе внутри вашего перехода в IO что-то вроде val result1 = callResource1() callResource2(result1) , то вы, конечно, получите свой happens before. Если написано не так, то я не понял по вашему описанию, как.

Taras-Murzenkov Автор вопроса
Andrew Mikhaylov
Если у вас написано в сервисном методе внутри ваше...

Именно так написано. Спасибо. А всегда корутины гарантируют happens before?

Taras Murzenkov
Именно так написано. Спасибо. А всегда корутины ...

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

Taras-Murzenkov Автор вопроса
Taras Murzenkov
Я имел ввиду withContext (IO) {} :)

Ну тогда там нет подводных камней, которые могут инвертировать порядок. Как пишете, так и выполнится.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта