запросы на два различных ресурса: callResource1(), callResource2().
Есть сервисный метод, который вызывает два метода внутри себя: ждёт выполнения callResource1() и передаёт результат выполнения в callResource2(), а потом возвращает результат.
Если я помечаю два метода как suspend и внутри сервисного метода делаю launchWithContext(IO), то гарантируется ли порядок выполнения (ex happens before)? Будет ли барьер синхронизации?
Грубо говоря, может ли вызваться сначала callResource2(), а потом callResource1()?
Не знаю что за launchWithContext, но в вашем кейсе достаточно внутри корутины вызывать последовательно эти методы, при необходимости меняя контекст через withContext
Если у вас написано в сервисном методе внутри вашего перехода в IO что-то вроде val result1 = callResource1() callResource2(result1) , то вы, конечно, получите свой happens before. Если написано не так, то я не понял по вашему описанию, как.
Именно так написано. Спасибо. А всегда корутины гарантируют happens before?
Ну значит всё хорошо. Там не будет никаких барьеров, там буквально сгенерируется стейт машина, которая вызовет первую функцию и вернёт маркер, с которым последующий запуск будет вести к продолжению после неё (и вызову второй функции).
Я имел ввиду withContext (IO) {} :)
Ну тогда там нет подводных камней, которые могут инвертировать порядок. Как пишете, так и выполнится.
Обсуждают сегодня