이 포스트에서는 하나의 앱에서 FastAPI와 다른 서비스를 같이 비동기로 처리하는 방법에 알아본다.
예시 시나리오
센서를 제어하고 데이터를 처리하는 루틴이 있고 이 루틴에서 실시간으로 들어오는 데이터를 처리하여 FastAPI로 들어오는 클라이언트 요청에 대해 적절한 결과를 반환하려고 한다.
첫 번째 시도 - 실패
첫 시도는 다음과 같이 센서 처리와 API 서비스를 async 함수인 코루틴으로 만들어 __main__에서 asyncio.run()으로 묶어 실행하도록 했다.
하지만 결과는 기대와 달리 센서 코루틴이 먼저 호출되면 API가 호출되지 않았다. 무슨 문제가 있었을까?
센서 서비스 로직 살펴보기
일단 센서 코루틴은 완전하게 작동함을 파악할 수 있었다.
센서 코루틴은 실행하지만 API 코루틴은 실행되지 않는 것으로 보아 센서 코루틴과 관련된 코드에 문제가 있을 것으로 보고 분석을 했다.
문제는 바로 while 문에 있었다. 코루틴을 만들었다고 하더라도 무한 루프가 존재할 때는 코루틴이 sleep하지 않고 무한정 돌아간다.
이 문제를 해결하는 법은 매우 간단했다. 한 반복이 끝날 때마다 asyncio.sleep을 호출하여 코루틴에게 명시적으로 sleep으로 들어가라고 하는 것이다.
이러면 한 반복이 끝난 후 일단 sleep으로 바꿔서 API 코루틴이 주도권을 가져가서 API 서비스도 잘 실행한다.
후기
쓰레드(코루틴) 안에 무한 루프가 있는 코드를 실행하는 건 처음이라 이를 해결하는데 어려움이 있었다.
앞으로는 무한 루프가 아니더라도 소요 시간이 길 것으로 추정되는 로직에는 명시적으로 sleep을 부여하여 프로세스를 독점하지 않도록 해야겠다.
'Python > FastAPI' 카테고리의 다른 글
나만의 STT 서버 만들기 feat. OpenAI Whisper (6) | 2024.11.15 |
---|