coroutineScope 대 SupervisorScope

8082 단어 androidkotlin
저는 Amit Shekhar , 개발자들이 고임금 기술직을 구하도록 돕는 멘토입니다.

이 블로그에서는 Kotlin 코루틴의 coroutineScopesupervisorScope에 대해 알아봅니다.
coroutineScopesupervisorScope 사이에는 큰 차이가 있으며 그 차이를 이해해야 합니다. 그렇지 않으면 Kotlin 코루틴 코드에서 무슨 일이 일어나고 있는지 알지 못한 채 실수를 할 것입니다.

이 문서는 원래 amitshekhar.me에 게시되었습니다.

항상 그렇듯이 coroutineScopesupervisorScope 의 주요 차이점을 이해하기 위해 실제 사용 사례를 사용하고 있습니다.

사용 사례 예:

다음과 같이 두 개의 네트워크 호출이 있다고 가정합니다.
  • 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가 도움이 되는 방법입니다.

    주요 차이점:
  • AcoroutineScope는 자식이 실패할 때마다 취소됩니다.
  • AsupervisorScope는 다른 자식 중 하나가 실패해도 다른 자식을 취소하지 않습니다.

  • 메모:
  • 다른 작업이 실패한 경우 계속하고 싶지 않은 경우 최상위 수준coroutineScope과 함께 try-catch를 사용하십시오.
  • 하나가 실패하더라도 다른 작업을 계속하려면 supervisorScope로 이동합니다.
  • 작업 중 하나 또는 일부가 실패한 경우 다른 작업을 계속하려면 최상위 수준supervisorScope 외에 각 작업에 대한 개인try-catch과 함께 try-catch를 사용합니다.

  • 이것은 Kotlin 코루틴에 있는 coroutineScopesupervisorScope에 관한 것입니다.

    지금은 그게 다입니다.

    감사

    Amit Shekhar

    다음에서 나와 연결할 수 있습니다.


  • GitHub
  • Facebook

  • Read all of my high-quality blogs here.

    좋은 웹페이지 즐겨찾기