해결된 질문
작성
·
40
1
안녕하세요 강의 잘 듣고 있습니다.
Code4-17에서 dispatchers를 사용하지 않고 코드를 그대로 실행하면 while문 코루틴이 cancel이 되지 않는데 왜 그런걸까요??
메인스레드 1개의 스레드에서만 동작하여 상태를 바꿀 수 없기 떄문일까요??
답변 2
2
dkdiehdbcjsk jehdb님 안녕하세요. 해당 경우는 launch 코루틴이 메인스레드를 점유 후 양보하지 않기 때문입니다. runBlocking 코루틴에서 cancel이 실행돼야하는데 계속 대기 상태에 머물러서 그렇습니다.
이에 관한 자세한 내용은 이후 강의에서 다루는 코루틴의 양보와 관련된 내용에서 배우실 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. dkdiehdbcjsk jehdb님.
코루틴을 사용하다 보면 코루틴이 취소되지 않는 경우를 종종 접할 수 있습니다. while
문 내의 코루틴이 cancel
로 인해 기대한 대로 종료되지 않는 이유는 보통 두 가지 원인에서 찾아볼 수 있습니다:
코루틴 취소 협조 여부: 코루틴 내부에서 while
루프와 같은 연산을 막고 있는 경우, 취소가 되지 않을 수 있습니다. 코루틴은 기본적으로 취소가 가능하지만, 명령 실행 도중에는 취소 요청을 받을 수 없습니다. 이를 해결하려면 delay
나 yield
와 같은 일시중단 기능을 사용하여 협조적인 취소(cooperative cancellation)를 구현해야 합니다.
디스패처 관련 문제: Dispatcher
를 명시적으로 설정하지 않으면 기본 디스패처가 사용되는데, 이는 코루틴이 동일한 스레드에서 작업을 계속하게 만들 수 있습니다. 메인 스레드에서 실행되는 경우, 스레드를 차단하는 작업 (Thread.sleep
, tight loop
)이 있으면 취소가 어려울 수 있습니다.
이를 해결하기 위해, while
루프 내에서 어떤 형태로든 일시 중단이 필요한지 확인해 보시고, dispatchers
를 적절히 사용하여 스레드 블로킹 상황을 피하시기 바랍니다.
혹시 코드에 delay
등을 사용하여 협조적인 취소를 시도하지 않으셨다면, 코루틴 블록 내 적절한 위치에 추가해 보세요.
관련된 내용을 자세하게 알고 싶으시다면, 협조적 취소와 디스패처 설정 관련 강좌 등을 참고해 보시면 좋을 것 같습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.