
비동기 작업의 단위
- 원문 그대로 옮겨온 것이 아니라 내용이 틀렸을 수 있습니다. 필요한 부분을 발췌하고 섞어서 학습용으로 적는 글입니다.
- 내용 자체가 Concurrency의 다양한 개념과 섞여서 설명되어 이 글만 봐서는 이해가 안 됩니다. 모르는 건 넘기면서 보는 게 좋습니다.
Overview
생성
Task의 인스턴스를 만드는 것은, 해당 Task가 수행할 작업이 포함된 클로저를 이용한다는 것을 말한다. Task는 생성 후 즉시 실행을 시작할 수 있고, 명시적으로 시작하거나 예약이 필요 없다.
동작
Task을 만든 후에는 인스턴스를 사용하여 상호 작용한다. (ex. 작업이 완료될 때까지 기다리거나 취소)
Task의 완료 혹은 취소 전에 Task에 대한 참조를 삭제하는 것은 문제가 아니다. Task는 참조 유지 여부와 관계없이 실행된다. 하지만, Task에 대한 참조를 삭제하면 해당 Task의 결과를 기다려서 행동하거나, 취소할 수 있는 기능을 포기하는 것이다.
detached task 혹은 child Task의 작업을 지원하기 위해 yield() 등의 메서드들을 가진다. 이런 메서드들은 비동기의 일부로, 항상 기존 작업의 일부로 호출된다. Task의 일부로 실행 중인 코드만 해당 Task와 상호 작용이 가능하다. 그러기 위해서는 static(정적) 메서드 중에 하나를 이용하면 된다.
Task의 실행은 suspension point (일시 중단 지점) 또는 completion(완료) 때 종료된다. 이는 PartialAsyncTask의 인스턴스로 표시된다. 만약 커스텀 executor를 구현하지 않는다면 부분 작업과 직접 상호작용하지 않는다.
Task Cancellation
Task는 cancel이라는 상태를 표시해 주지만, cancel인 상태를 처리하는 구현은 없다. Task 내부에서 작업 중인 내용에 따라 그 작업을 중지하는 올바른 방법은 그때마다 다르다.
마찬가지로, 중지가 적절하다고 여겨지는 시점에서 중지를 하는 것은 Task의 내부에서 동작하는 코드가 책임을 가진다. 여러 작업을 가지고 있는 긴 관점의 Task는 여러 부분에서 cancel 여부를 확인하고, 해당 작업에서 cancel을 다르게 처리해야 할 수 있다. 작업을 중지하기 위해 에러를 throw 해야 하는 경우, Task.checkCancellation() 함수를 사용한다. 또는, 지금까지 작업한 결과, 빈 결과, nil을 리턴할 수도 있다.
Cancellation이란 Bool이다. 그러므로 왜 취소가 됐는지 등의 추가 정보는 존재하지 않는다. Task가 복수의 이유로 취소될 수 있고 cancel 되는 중에 사유가 더 발생할 수 있다는 점이 고려된 것이다.