피드로 돌아가기
Dev.toBackend
원문 읽기
Future 인스턴스 대신 Fn() -> Future 추상화로 Rust Async Task 재사용 구조 설계
I Just Wanted to Reuse Async Functions in Rust. I Ended Up Building a Tiny Task Manager
AI 요약
Context
Tokio 기반 Async 환경에서 단순 함수 호출을 넘어 작업의 등록, 제어, 재시작이 가능한 범용 Task Manager 필요성 대두. 각 Async 함수가 고유한 Concrete Future 타입을 반환함에 따라 단일 컬렉션 내 저장 및 일관된 인터페이스 관리가 불가능한 제약 발생.
Technical Solution
- 실행된 결과물인 Future 인스턴스가 아닌 Future를 생성하는 Recipe 형태의 Fn() -> Future 구조 채택
- Concrete Function Item에서 Function Pointer, Closure를 거쳐 dyn Fn() -> Future 형태의 Trait Object로 추상화 단계 확장
- Boxed Future 도입을 통한 서로 다른 Future 타입의 단일 타입화 및 런타임 다형성 확보
- Task 정의와 실행 로직을 분리하여 Manager가 Task의 생명주기와 Restart Policy를 독립적으로 제어하는 구조 설계
- Pinning 및 Ownership 개념을 적용하여 Async Task의 안전한 메모리 배치와 실행 보장
실천 포인트
- Async 작업의 재시작이 필요할 때 Future 객체가 아닌 Future를 반환하는 팩토리 함수를 저장하고 있는가 - 다양한 Async 함수를 단일 리스트로 관리하기 위해 Trait Object(dyn)와 Boxing을 적절히 활용했는가 - 비즈니스 로직(Task)과 실행 제어 로직(Manager)이 결합되지 않고 분리되어 설계되었는가 - 각 작업의 성격에 맞는 Restart Policy와 종료 시맨틱이 명확히 정의되었는가