해결된 질문
작성
·
42
·
수정됨
1
- 학습 관련 질문을 남겨주세요. 질문을 상세히 작성하면 더 좋습니다.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
먼저 좋은 강의 감사합니다!
혼자서 다음과 같이 마구마구 찍어보고있었습니다.
이때 저희 예상과 다르게 돌아가서 질문을 드립니다.
저의 가설로는 "withContext는 코루틴을 생성하지 않고 Context만 바꾸니 코루틴을 제어하고 추적하는데 사용되는 Job은 새로 만들어지지 않을 것이다. 따라서 job1과 job5는 같을 것이다." 이었습니다.
하지만 결과는 새로운 job을 만들고 job의 부모에 job1을 연결시키더군요.
동일한 코루틴에서 동작하는데 왜 새로운 Job을 만드는 것인가요?
fun main() = runBlocking {
val job1 = coroutineContext[Job] // 1
coroutineScope {
val job2 = coroutineContext[Job.Key]
val job3 = launch {}
val job4 = launch {}
println("job2 = ${job2}") // 2
println("job2 parent = ${job2?.parent}")
println("job3 parent = ${job3.parent}")
println("job4 parent = ${job4.parent}")
}
withContext(Dispatchers.Default) {
val job5 = coroutineContext[Job.Key]
println("job5 = ${job5}")
println("job5 parent = ${job5?.parent}")
}
println("job1 = ${job1}")
}
//
// job5 = DispatchedCoroutine{Active}@4311e223
// job5 parent = BlockingCoroutine{Active}@1c2c22f3
// job1 = BlockingCoroutine{Active}@1c2c22f3
coroutineScope도 주석 1, 2 부분이 같은 코루틴이라 job1이랑 job2가 동일하게 나올 거라 생각했는데 다르군요.
그렇다면 현재 상황에서 "하나의 코루틴에 여러 개의 job(?)을 가진 것 아닌가? 이러면 job으로 코루틴을 제어할 수 있나?" 라는 의문이 듭니다.
job과 코루틴의 관계가 헷갈립니다😱
답변 1
1
구쟁천님 안녕하세요. 지식 공유자 조세영입니다.
withContext 호출 시 Job이 새로 생성돼 헷갈리셨을 것 같습니다. 이 강의에서 Job에 대해 설명할 때는 Job이 코루틴을 제어하기 위한 인터페이스라고 설명하고, 이에 따라 Job을 사용해 코루틴을 제어하는 방법을 위주로 설명했는데요. 실제로 Job 인터페이스는 다양한 구현체를 가지고, launch 함수 호출시 생성되는 StandaloneCoroutine을 비롯해 여러 구현체를 가지고 있습니다.
withContext 호출 시에는 Job의 구현체 중 하나인 DispatchedCoroutine이 생성되지만, 저는 이것이 새로운 코루틴을 생성하기보다는 현재 코루틴의 실행 컨텍스트를 전환하는 도구(코루틴의 실행 컨텍스트가 바뀌었을 때 다른 dispatch 하고 응답을 받아올 때까지 기다리는 도구)라고 이해했습니다. 실제로 위의 코드에서 디버깅을 해보시면 Job의 구현체는 다르지만, 같은 CoroutineId를 가지게 될 것으로 보입니다. 즉, 같은 코루틴에 연결되어 있다고 이해하면 좋을 것 같습니다.
이번 강의에서는 코루틴이 추상 레벨에서 노출하는 API를 위주로 다루었고, 이 내용들은 최대한 공식 기술 문서 등의 근거 자료가 있는 부분들을 위주로 제가 이해한 내용들을 덧붙이는 방식으로 강의를 진행했습니다. 질문 주신 부분에 대한 것은 사실 공식 기술 문서나, 기타 자료에는 나와 있지 않아서 제가 라이브러리 내부를 보고 파악한 내용을 바탕으로 답변 드려 정확하지 않을 수 있는 점 양해 부탁드립니다.
감사합니다. 답변이 도움이 되면 좋을 것 같습니다.