graceful shutdown

`join` 전에 채널을 닫아야 워커가 루프를 빠져나온다

`sender`를 먼저 버리면 `recv`가 에러를 반환하고, 워커는 그 신호를 보고 종료 경로로 들어간다.

1

`Drop` 시작

스레드 풀이 스코프를 벗어나며 정리 코드가 실행된다.

2

송신자 제거

drop(self.sender.take())
3

수신 실패

채널이 닫히면 기다리던 `recv` 호출이 `Err`를 돌려준다.

4

루프 종료

워커가 `break`한 뒤 `join` 대상 스레드가 끝난 상태가 된다.

Option + take

소유권을 안전하게 빼내기

`sender`와 `thread`를 `Option`으로 감싸 두면 `Drop` 안에서 값을 이동시키고 빈 자리에는 `None`을 남길 수 있다.

deadlock avoided

정지 신호 없는 `join`은 기다림에 갇힌다

워커가 계속 작업을 기다리면 메인 스레드도 `join`에서 기다리므로, 먼저 기다림을 깨우는 신호가 필요하다.