프로그래밍
2시간 전
0
비동기 Rust에서의 '스누징(snoozing)' 문제는, 진행 가능한 Future가 폴링되지 않아 멈추는 현상을 의미하며, 이는 데드락과 지연의 주요 원인입니다. 특히, select! 매크로에서 참조로 Future를 폴링하거나, buffered 스트림과 같은 내부에 Future를 포함한 스트림을 사용할 때 스누징이 발생하기 쉽습니다. 전통적인 스레드 기반 동기화에서는 스레드 강제 종료나 일시 중지가 심각한 데드락을 유발하지만, Rust 비동기 환경에서는 Future 소유권과 drop 메커니즘 덕분에 비교적 안전하게 취소가 가능합니다. 따라서, 비동기 함수 내에서 Future를 직접 소유하지 않고 참조로 다루거나, 핀(Pin)을 직접 조작하는 것은 스누징과 데드락 위험을 높이므로 피해야 하며, 대신 select! 같은 매크로 사용 시 Future를 소유권으로 넘기는 방식이 권장됩니다. 이를 보완하기 위해, 저자는 join_me_maybe 크레이트와 같은 새로운 동시성 패턴 도구를 제안하며, 고수준에서는 "절대 Future를 스누즈하지 말라"는 원칙을 지키는 것이 중요하다고 강조합니다.