반응형
해당 개념들을 원문으로 이해하기에는 어려움이 있어
내 식대로 정리를 해보는 시간을 가졌다.
프로세스란?
하나의 가게
- 이 가게는 다른 가게와 완전히 분리된 공간을 가짐
- 가게 안에서만 셰프들이 자유롭게 이동하고 일할 수 있음
- 다른 가게의 주방이나 재료에는 접근 불가
쓰레드란?
가게에 있는 셰프들
- 실제로 요리를 하는 주체
- 여러 셰프가 같은 주방(메모리) 을 공유함
메인 쓰레드란?
가게에 하나만 있는 수석 셰프
- 손님 응대, 플레이팅(UI)는 반드시 이 셰프가 담당
- 한 명뿐이기 때문에 오래 붙잡으면 가게가 멈춘 것처럼 보임
쓰레드 풀이란?
일을 배정받기 위해 대기 중인 셰프들
- 이미 고용되어 대기 중인 셰프 묶음
- 주문이 들어올 때마다 새 셰프를 뽑지 않고
→ 대기 중인 셰프에게 일을 맡김
Task란?
요리 주문서
- “이 요리를 해달라”는 작업 요청
- 누가 요리할지는 정해져 있지 않음
- 시스템이 상황에 맞게 셰프(쓰레드)를 배정
엑터란?
한 번에 한 명의 셰프만 들어가서 요리할 수 있는 방
- 동시에 여러 셰프가 들어갈 수 없음
- 방 안의 재료(상태)는 순서대로, 안전하게 사용됨
- 항상 같은 셰프가 들어오는 것은 아님
→ 한 번에 하나의 작업(Task)만 허용됨
메인 엑터란?
수석 셰프만 들어가서 요리할 수 있는 특수한 방
- UI 관련 작업은 반드시 이 방에서 처리됨
보충 설명
그럼 메인 엑터가 붙어있는 클래스는
수석 셰프가 일을 다 하는가?
→ 그건 아님
- 주문(Task)이 들어와 특수 방에서 요리를 시작함
- 요리 중 오래 걸리는 재료 손질(await)이 나오면
→ 해당 작업은 잠시 중단(suspend) - 그동안:
- 특수 방은 점유되지 않음
- 수석 셰프는 다른 UI 작업을 계속 처리 가능
- 재료 손질이 끝나면:
- 다시 특수 방(MainActor)으로 돌아와
- 중단된 지점부터 요리를 이어서 진행
📌 즉
- @MainActor는 메인 쓰레드를 독점하지 않음
- await는 블로킹이 아니라 잠시 양보
핵심 한 줄 요약
- Task는 주문서
- Thread는 셰프
- Thread Pool은 대기 중인 셰프들
- Actor는 한 번에 한 명만 들어갈 수 있는 방
- MainActor는 UI 전용 특수 방
- Sendable (안전 포장된 재료): 이 주방(Actor)에서 저 주방으로 배달 가도 맛이 변하거나 상하지 않는다고 보증된 재료.
기타 용어 정리
.debounce(for: .milliseconds(500), scheduler: RunLoop.main)
RunLoop.main = 수석 셰프 전용 벨 시스템
send 위치receive(on:) 필요?
| @MainActor 내부 | 거의 불필요 |
| 일반 class | 필요 |
| detached Task | 필요 |
| 네트워크 레이어 | 필요 |
| 확신 없음 | 그냥 붙이는 게 안전 |
Actor는 동시성 격리 모델이고
Combine은 스레드 기반 실행 모델임.
Actor가 send를 메인에서 실행하면 괜찮지만
Combine은 그걸 자동 강제하지 않음.
-> Combine은 Actor의 개념을 알고 있지 않음
반응형
'Swift' 카테고리의 다른 글
| [Swift] Swift Thread - GCD (0) | 2023.07.02 |
|---|