📌 오류 제목
파이썬 코드에서 async를 적용했지만 실제 서비스에서는 비동기 작업이 적용되지 않은 건
📍 발생 환경
- OS: Ubuntu 22.04
- Python 3.10.12, langchain 0.3.12, FastAPI 0.115.6, uvicorn 0.34.0
💥 오류 내용
- 비즈니스 로직에 해당하는 파이썬 코드들을 모두 async 비동기 처리했으나,실제 서비스에서는 여러 창을 띄우고 실험했더니 적용되지 않은 현상을 발견
- 비동기 처리가 되지않고 이전 작업을 모두 마쳐야 다음 작업이 실행되는 것으로 확인함
- 때문에 사용자는 앞단의 처리가 모두 완료될 때까지 대기해야 하는 문제 사항 발생
- 정확히 따지자면 오류는 아니고 컴퓨터에 대한 이해가 부족해서 발생한 문제 😓
🔍 문제 원인 분석
- 비즈니스 로직은 FastAPI 파이썬 코드로 작동시키고, 이 py를 작동시키는 쉘 파일에서 uvicorn 설정사항들을 변경할 수 있음
- uvicorn 설정 중 worker의 값을 직접 설정하지 않았기에 default 값인 1이 사용되었는데, 이때문에 비동기 작업을 처리할 수 없었음
🛠️ 해결 방법
- FastAPI 서버를 실행하는 쉘 파일에서 아래와 같이 worker의 값을 적당히 큰 수로 설정
uvicorn main:app (호스트, 포트 설정 등) --worker 24 (로그 저장 경로)
--workers INTEGER
Number of worker processes. Defaults to the $WEB_CONCURRENCY environment variable if available, or 1. Not valid with --reload.
(출처: uvicorn.org)
🎊 핵심 개념
보다보니 worker랑 thread, process의 정의가 무엇인가.. 궁금해서 gpt랑 대화하며 정리해보았다.
- worker: 어떤 작업(task)을 처리하는 역할을 가진 논리적 실행 단위.
→ 실제로는 하나의 프로세스나 스레드로 구현됨. Worker ⊇ { Process, Thread } - process: 실행 중인 프로그램의 인스턴스. 각각의 프로세스는 독립된 메모리 공간(코드, 데이터, 스택 등)을 가짐.
- thread: 프로세스 내에서 실제 작업을 수행하는 실행 단위. 하나의 프로세스 안에는 여러 개의 스레드가 있을 수 있음 (multi-threading). 스레드들은 프로세스의 메모리 공간을 공유함. 비용(오버헤드)이 낮고 빠름, 대신 충돌 방지 처리를 잘 해줘야 함.
새삼 컴퓨터 공부를 각잡고 해야겠다는 생각을 하게 되었다..🥲 뭐부터 하지..
📑 참고
Uvicorn
An ASGI web server, for Python. Introduction Uvicorn is an ASGI web server implementation for Python. Until recently Python has lacked a minimal low-level server/application interface for async frameworks. The ASGI specification fills this gap, and means w
www.uvicorn.org
'繩鋸木斷水滴石穿 > Python' 카테고리의 다른 글
[IR] 유사 키워드 매칭하기: python rapidfuzz 사용하기 (3) | 2024.09.29 |
---|---|
[python] tenacity 라이브러리를 이용해 코드 재실행하는 방법 (0) | 2024.04.13 |
[Tips] 파이썬에서 구글 드라이브의 대용량 파일 다운로드 받기 (1) | 2023.10.11 |
[pandas] style로 데꾸(데이터프레임 꾸미기)하는 방법 (1) | 2023.08.13 |
[Dash] 파이썬에서 Dash를 이용한 대시보드 구축하기 (0) | 2022.12.21 |