Inflearn brand logo image

인프런 커뮤니티 질문&답변

dkdiehdbcjsk jehdb님의 프로필 이미지
dkdiehdbcjsk jehdb

작성한 질문수

코틀린 코루틴 완전 정복

코루틴 취소 확인 시점

cancel 질문드립니다.

해결된 질문

작성

·

40

1

안녕하세요 강의 잘 듣고 있습니다.

Code4-17에서 dispatchers를 사용하지 않고 코드를 그대로 실행하면 while문 코루틴이 cancel이 되지 않는데 왜 그런걸까요??

메인스레드 1개의 스레드에서만 동작하여 상태를 바꿀 수 없기 떄문일까요??

답변 2

2

조세영님의 프로필 이미지
조세영
지식공유자

dkdiehdbcjsk jehdb님 안녕하세요. 해당 경우는 launch 코루틴이 메인스레드를 점유 후 양보하지 않기 때문입니다. runBlocking 코루틴에서 cancel이 실행돼야하는데 계속 대기 상태에 머물러서 그렇습니다.

이에 관한 자세한 내용은 이후 강의에서 다루는 코루틴의 양보와 관련된 내용에서 배우실 수 있습니다.

0

안녕하세요, 인프런 AI 인턴입니다. dkdiehdbcjsk jehdb님.

코루틴을 사용하다 보면 코루틴이 취소되지 않는 경우를 종종 접할 수 있습니다. while 문 내의 코루틴이 cancel로 인해 기대한 대로 종료되지 않는 이유는 보통 두 가지 원인에서 찾아볼 수 있습니다:

  1. 코루틴 취소 협조 여부: 코루틴 내부에서 while 루프와 같은 연산을 막고 있는 경우, 취소가 되지 않을 수 있습니다. 코루틴은 기본적으로 취소가 가능하지만, 명령 실행 도중에는 취소 요청을 받을 수 없습니다. 이를 해결하려면 delayyield와 같은 일시중단 기능을 사용하여 협조적인 취소(cooperative cancellation)를 구현해야 합니다.

  2. 디스패처 관련 문제: Dispatcher를 명시적으로 설정하지 않으면 기본 디스패처가 사용되는데, 이는 코루틴이 동일한 스레드에서 작업을 계속하게 만들 수 있습니다. 메인 스레드에서 실행되는 경우, 스레드를 차단하는 작업 (Thread.sleep, tight loop)이 있으면 취소가 어려울 수 있습니다.

이를 해결하기 위해, while 루프 내에서 어떤 형태로든 일시 중단이 필요한지 확인해 보시고, dispatchers를 적절히 사용하여 스레드 블로킹 상황을 피하시기 바랍니다.

혹시 코드에 delay 등을 사용하여 협조적인 취소를 시도하지 않으셨다면, 코루틴 블록 내 적절한 위치에 추가해 보세요.

관련된 내용을 자세하게 알고 싶으시다면, 협조적 취소와 디스패처 설정 관련 강좌 등을 참고해 보시면 좋을 것 같습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dkdiehdbcjsk jehdb님의 프로필 이미지
dkdiehdbcjsk jehdb

작성한 질문수

질문하기