오늘 할 일: 갈고 닦기

📌 오류 제목

 

파이썬 코드에서 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 (로그 저장 경로)

 

  1.  

--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). 스레드들은 프로세스의 메모리 공간을 공유함. 비용(오버헤드)이 낮고 빠름, 대신 충돌 방지 처리를 잘 해줘야 함.



새삼 컴퓨터 공부를 각잡고 해야겠다는 생각을 하게 되었다..🥲 뭐부터 하지..

 

 

📑 참고

 

https://www.uvicorn.org/

 

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