graceful shutdown

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

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

1

Drop 시작

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

2

송신자 제거

drop(self.sender.take())
3

수신 실패

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

4

루프 종료

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

Option + take

소유권을 안전하게 빼내기

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

deadlock avoided

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

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