중지 컨텍스트 내에서 잠재적으로 문제가 될 수 있는 묵시적 CoroutineScope 리시버의 액세스를 보고합니다.
suspend 함수나 람다가 외부 컨텍스트에서 묵시적 CoroutineScope 리시버를 캡처할 경우, 예상치 못한 동작이 발생할 수 있습니다.
이런 코드는 구조적 동시성의 규칙을 위반하기 쉬우며, 겉보기에 잘 구조화된 것처럼 보일 수 있습니다.
이로 인해 오류를 처리하거나 계산을 취소하거나 수명 주기를 관리할 때 잘못된 동작이 발생할 수 있습니다.
일반적인 예시:
fun processFlow(flow: Flow<String>) {
runBlocking {
flow.collectLatest {
// this@runBlocking CoroutineScope에서 시작됩니다
launch {
longProcessing(value)
}
}
}
}
suspend fun longProcessing(value: String) { ... }
위 예시에서 launch { ... } 호출은 외부 runBlocking 호출에서 묵시적 CoroutineScope 내 코루틴을 시작합니다.
이 때문에 collectLatest는 필요 시 이러한 코루틴을 취소할 수 없습니다.
이 검사는 launch가 현재 중단 람다 외부(즉, collectLatest의 본문)에서 캡처된 CoroutineScope에서 호출된 것을 탐지합니다.
이 특정 문제에 대한 추가 정보는 이 GitHub 이슈를 참조하십시오.
가능한 해결 방법:
이 문제를 해결하는 방법은 다음과 같습니다.
coroutineScope { ... } 빌더를 사용하여 suspend 함수의 수명 주기에 연결된 하위 범위를 만듭니다CoroutineScope가 현재 구문 컨텍스트에서 도출되도록 코드를 재배열합니다
코드가 올바르다고 확신하는 경우 의도를 명확히 하기 위해 리시버를 명시적으로 지정할 수 있습니다. 위 예시에서는 this@runBlocking.launch { ... }가 될 것입니다.
단, 이 경우 코드의 의미가 변하지 않아야 한다는 점에 유의하세요.