rsloop: Rust로 만든 Python asyncio 이벤트 루프 (io_uring 지원)
요약
기사 전체 정리
- Python asyncio의 이벤트 루프를 Rust로 구현한
rsloop이 나왔음. PyO3 기반이고, pip install로 바로 쓸 수 있음. uvloop의 대항마 포지션인데, 접근 방식이 다름
아키텍처
각
rsloop.Loop은 전용 Rust 런타임 스레드를 하나 소유함. 이 스레드가 루프 조율과 I/O를 담당하고, Python 콜백/태스크/코루틴은run_forever()나run_until_complete()을 호출한 스레드(보통 메인 Python 스레드)에서 실행됨Linux에서는
compio+io_uring을 사용해서 fd watcher, TCP/Unix 소켓 readiness, 소켓 읽기, non-TLS 서버 accept을 런타임 스레드에서 처리함. 다만 TLS I/O, TLS accept, 레거시 transport write는 아직 헬퍼 스레드를 사용하는 하이브리드 모델임플랫폼 지원은 Linux, macOS, Windows 모두 커버. Windows 파이프 transport와 subprocess 워크플로우도 됨
기능 범위
asyncio 호환 표면이 꽤 넓음:
- 루프 라이프사이클:
run_forever,run_until_complete,stop,close - 스케줄링:
call_soon,call_later,call_at+ Handle/TimerHandle - Future/Task:
create_future,create_task,run_in_executor - I/O:
add_reader/add_writer,sock_recv/sock_sendall,create_server/create_connection - Unix 소켓, 파이프, subprocess, 시그널 핸들러까지 지원
contextvars.Context캡처 하에 콜백 실행- Python 3.12+
asyncio.run(loop_factory=...)통합
- 루프 라이프사이클:
import하면 자동으로
asyncio.open_connection()과asyncio.start_server()를 몽키패치함.RSLOOP_USE_FAST_STREAMS환경변수로 끌 수 있고, SSL이 설정되면 자동으로 stdlib으로 폴백됨
벤치마크와 한계
CPython 3.14.0 Linux 기준 벤치마크 스크립트가 포함되어 있고, uvloop과의 콜백/태스크/TCP 스트림 비교가 가능함. FastAPI 데모도 있어서 stdlib asyncio, uvloop, rsloop 세 가지로 같은 앱을 돌려볼 수 있음
현재 한계도 명확함:
- TLS는 rustls 백엔드 사용, 암호화된 프라이빗 키 미지원
preexec_fn미지원 (fork/exec 사이에 Python 실행이 unsafe)- 싱글 런타임 스레드 I/O 모델로 전환 중이지만 아직 완성 안 됨
팁
> Python 3.8~3.14(+free-threaded 3.14t)까지 휠을 빌드할 수 있고, Tracy 프로파일러 통합도 지원함. --features profiler로 빌드하면 됨
- asyncio 이벤트 루프를 Rust로 재구현하는 접근은 uvloop(libuv 기반 Cython)과 다른 길을 가는 거임. io_uring + compio 조합으로 Linux에서의 I/O 성능을 노리는 방향이 흥미로움. 아직 하이브리드 모델이라 완성도는 더 지켜봐야 하지만, 방향성 자체는 주목할 만함
댓글
댓글
댓글을 불러오는 중...