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

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

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

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

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

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

6 ответов

7 просмотров

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

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

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

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

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

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

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

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

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

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

Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
А чем вам питонисты не угодили?😂
.
79
Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
Всем здравствуйте! Я хотел узнать сколько стоит средняя месячная зарплата у Electron js разработчиков? Мне очень это важно и нужно, плиз помогите узнать эту инфу! Для Джунио...
U.K.
10
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
83
А дин типизация это хорошо или плохо?
Alexey
12
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Hello. Could you please help me with finding all coordinates within a radius using a spatial index, given that I have a table with coordinates? SET @lng = 37.57925; SET @lat ...
Rinchin G
8
Карта сайта