coroutineScope 대 SupervisorScope
이 블로그에서는 Kotlin 코루틴의
coroutineScope
대 supervisorScope
에 대해 알아봅니다.coroutineScope
와 supervisorScope
사이에는 큰 차이가 있으며 그 차이를 이해해야 합니다. 그렇지 않으면 Kotlin 코루틴 코드에서 무슨 일이 일어나고 있는지 알지 못한 채 실수를 할 것입니다.이 문서는 원래 amitshekhar.me에 게시되었습니다.
항상 그렇듯이
coroutineScope
와 supervisorScope
의 주요 차이점을 이해하기 위해 실제 사용 사례를 사용하고 있습니다.사용 사례 예:
다음과 같이 두 개의 네트워크 호출이 있다고 가정합니다.
getUsers()
getMoreUsers()
서버에서 데이터를 가져오기 위해 이 두 네트워크 호출을 병렬로 수행하려고 합니다.
이 예제here의 전체 소스 코드를 찾을 수 있습니다.
Kotlin 코루틴에서는 작업을 병렬로 수행하기 위해
async
를 사용합니다.아래와 같이 코드를 작성할 수 있습니다.
launch {
try {
val usersDeferred = async { getUsers() }
val moreUsersDeferred = async { getMoreUsers() }
val users = usersDeferred.await()
val moreUsers = moreUsersDeferred.await()
} catch (exception: Exception) {
// handle exception
}
}
여기서 우리는 한 가지 중요한 문제에 직면하게 됩니다. 두 네트워크 호출 중 하나라도 오류가 발생하면 응용 프로그램이 충돌합니다! catch 블록으로 이동하지 않습니다.
이를 해결하려면 아래와 같이
coroutineScope
를 사용해야 합니다.launch {
try {
coroutineScope {
val usersDeferred = async { getUsers() }
val moreUsersDeferred = async { getMoreUsers() }
val users = usersDeferred.await()
val moreUsers = moreUsersDeferred.await()
}
} catch (exception: Exception) {
// handle exception
}
}
이제 네트워크 오류가 발생하면 catch 블록으로 이동합니다. 이것이
coroutineScope
가 도움이 되는 방법입니다.하지만 실패한 네트워크 호출에 대해 빈 목록을 반환하고 다른 네트워크 호출의 응답을 계속하고 싶다고 다시 가정해 보겠습니다. 아래와 같이 개별 네트워크 호출에
supervisorScope
를 사용하고 try-catch
블록을 추가해야 합니다.launch {
try {
supervisorScope {
val usersDeferred = async { getUsers() }
val moreUsersDeferred = async { getMoreUsers() }
val users = try {
usersDeferred.await()
} catch (e: Exception) {
emptyList<User>()
}
val moreUsers = try {
moreUsersDeferred.await()
} catch (e: Exception) {
emptyList<User>()
}
}
} catch (exception: Exception) {
// handle exception
}
}
이제 오류가 발생하면 빈 목록으로 계속됩니다. 이것이
supervisorScope
가 도움이 되는 방법입니다.주요 차이점:
coroutineScope
는 자식이 실패할 때마다 취소됩니다. supervisorScope
는 다른 자식 중 하나가 실패해도 다른 자식을 취소하지 않습니다. 메모:
coroutineScope
과 함께 try-catch
를 사용하십시오. supervisorScope
로 이동합니다. supervisorScope
외에 각 작업에 대한 개인try-catch
과 함께 try-catch
를 사용합니다. 이것은 Kotlin 코루틴에 있는
coroutineScope
및 supervisorScope
에 관한 것입니다.지금은 그게 다입니다.
감사
Amit Shekhar
다음에서 나와 연결할 수 있습니다.
Read all of my high-quality blogs here.
Reference
이 문제에 관하여(coroutineScope 대 SupervisorScope), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/amitiitbhu/coroutinescope-vs-supervisorscope-2k91텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)