피드로 돌아가기
Dev.toBackend
원문 읽기
Celery Prefork 환경 내 Async Python 런타임 격리 및 Bridge Loop 설계
Running Async Python Inside Celery Is Harder Than You Think.
AI 요약
Context
Celery Worker의 Synchronous 실행 모델과 최신 Python Async 생태계 간의 불일치로 인한 유지보수 비용 증가 상황. 기존 asyncio.run() 또는 nest_asyncio 사용 시 Event Loop 중복 생성 및 실행 순서 비결정성으로 인한 Production 장애 발생 가능성 존재.
Technical Solution
worker_process_init시점을 활용해 각 Forked Process 내에 독립적인 Fresh Event Loop 생성- 생성된 Loop를 전담하여 구동하는 Daemon Thread를 배치하여 Celery Sync Thread와 런타임 격리
asyncio.run_coroutine_threadsafeAPI를 사용하여 Sync Worker Thread에서 Async Bridge Loop로 작업 위임 및 결과 대기push/apush명시적 메서드 분리를 통한 호출 컨텍스트(Sync/Async) 명확화 및 런타임 오류 조기 발견- OS Signal 기반 강제 종료 대신 Cooperative Timeout Cancellation 구조를 채택하여 리소스 정리 및 DLQ 기록 보장
실천 포인트
1. Celery Prefork 모델 사용 시 Parent Process의 Event Loop 객체가 Child로 상속되어 Deadlock을 유발하는지 확인
2. Sync-Async 경계 지점에서 `asyncio.run()` 대신 별도 Loop Thread와 `run_coroutine_threadsafe` 조합 검토
3. 자동 컨텍스트 감지 로직보다 명시적인 API 분리(Explicit Split)를 통해 런타임 불확실성 제거
4. 비동기 작업 취소 시 `finally` 블록을 통한 상태 보존 및 Cleanup 로직 설계