코루틴 스코프
313
投稿した質問数 6
코드를 보다보면 코루틴 스코프를 쓸 때, 소문자로 coroutineScope { } 블락이 있는 경우가 있고 대문자로 시작하는 CoroutineScope(Dispatchers.Main).launch { } 이런식으로 된 코루틴스코프가 있는데, 각각 어떤 차이이며 어느 상황에 각각을 써야하나요?
回答 1
0
안녕하세요! lkckss123님! 😊 앞선 질문 - https://www.inflearn.com/questions/1179607/coroutinescope-%EC%99%80-withcontext-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%A5%BC-%EC%9E%98-%EB%AA%A8%EB%A5%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4 - 에서 이어지는 것으로 생각됩니다!
CoroutineScope(Dispatchers.Main).launch { } 는 suspend 함수가 아니고, 새로운 코루틴 영역을 시작하기 위해 사용하는 것으로 알고 계실겁니다.
coroutineScope() 은 CoroutineScope()과 다르게 suspend 함수이고, 오히려 withContext()에 가깝습니다. coroutineScope() 안에 추가적인 코루틴을 만들면, 해당 코루틴들을 하나로 묶어 줄 수 있게 되죠. 다만 withContext()가 CoroutineContext를 바꾸면서 새로운 코루틴을 만들었다면, coroutineScope()은 딱히 context는 바꾸지 않습니다.
coroutineScope()은 다음 예제를 보시면 이해가 잘 되실거에요!
fun main(): Unit = runBlocking {
printWithThread("START")
printWithThread(calculateResult())
printWithThread("END")
}
suspend fun calculateResult(): Int = coroutineScope {
val num1 = async {
delay(1_000L)
10
}
val num2 = async {
delay(1_000L)
20
}
num1.await() + num2.await()
}
여기서 만약 calculateResult 를 coroutineScope 이 아닌 CoroutineScope 으로 만들려 한다면, Int 를 반환하지 못하고 Job 자체를 반환해야 할거에요!
fun main(): Unit = runBlocking {
printWithThread("START")
printWithThread(calculateResult())
printWithThread("END")
}
fun calculateResult(): Job = CoroutineScope(Dispatchers.IO).async {
val num1 = async {
delay(1_000L)
10
}
val num2 = async {
delay(1_000L)
20
}
num1.await() + num2.await() // 결과를 보고 싶다면 출력을 해야 한다!
}또한 coroutineScope 을 사용했을 때는 두 개의 async가 동작하고 덧셈 결과인 30이 출력되기 전까지 END 가 출력되지 않지만, CoroutineScope()을 사용하게 되면 START -> Job 반환 -> END 출력으로 실제 async 두 개가 동작할 때까지 대기하지 않습니다.
따라서 coroutineScope() 같은 경우는 진작 코루틴영역이 존재하는 상황에서 앞으로 만들 몇몇 코루틴을 묶어 주고, 해당 코루틴들을 먼저 실행시키고 싶을 때 사용한다고 보시면 되겠습니다.
감사합니다! 🙏
Dispatchers 별 차이점 관련 질문
0
93
1
코루틴과 가상 스레드의 차이가 궁금합니다.
1
310
2
Coroutine과 ThreadLocal관련 질문
0
154
2
선생님 강의를 듣고 크롤링에 코루틴을 적용해보고 있습니다. 그런데 코루틴이 하나만 나와서 동시처리가 안되는데 혹시 봐주실 수 있나요??
1
115
1
7강에 대해서 궁금증이 있는데요
1
116
2
Spring MVC에서 corountine 활용 방안
1
540
1
9강 코루틴 중단과 재개관련 문의 드립니다.
0
124
2
suspend 함수에 관해 추가적인 질문 있습니다! (runcatching, Result)
0
126
1
간단 질문.. join() vs delay()
0
158
2
코루틴을 잘 사용하고 있는지 궁금합니다.
0
196
1
CoroutineScope & Dispatcher 질문
0
161
2
async await 관련 질문
1
136
2
코루틴 실행 순서 궁금합니다.
1
232
2
corutine task에 대한 질문
1
195
2
completing의 존재의의가 궁금합니다.
1
161
1
코루틴 dispatcher IO관련 질문
0
187
1
Job 질문이 있습니다
1
203
1
스프링 MVC 환경에서의 코루틴
1
2096
1
자식1, 2와 부모코루틴의 관계
1
225
1
한 suspend fun 의 반환값이 다른 suspend fun의 파라미터로 쓰일 때
1
329
2
delay 함수에 대해 질문이 있습니다
1
394
1
runBlocking을 사용하는 경우가 있을까요?
0
400
1
delay가 없으면 실행 안 되는 이유
0
295
1
CoroutineScope 와 withContext 의 차이를 잘 모르겠습니다.
1
701
1

