인프런 커뮤니티 질문&답변

kristin님의 프로필 이미지
kristin

작성한 질문수

FastAPI 완벽 가이드

FastAPI ThreadPool 과 async 적용 시 유의 사항

ThreadPool 방식 질문드립니다

작성

·

63

0

강의 정말 도움 많이 되었습니다!!
강의 내용 중에 동시성인지 병렬성인지 헷갈리는게 있어 질문드립니다..!
7:35에 일반 def 함수 라우터로 작성한 ThreadPool(병렬) 방식은 매번 요청시 ThreadPool에서 유휴 Tread를 찾아 동작하고 i/o wait가 발생할때 context switch를 해가면서 작업하는 것으로 이해했는데...이게 맞다면..! 완벽한 병렬성이 아니라 동시에 작업하는 것 처럼 보이는 동시성으로 동작하는 건가요?

답변 2

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

강의가 도움이 되었다니, 저도 기쁘군요.

저는 동시성의 유형에 병렬과 비동기 처리가 있다고 생각합니다. 그리고 Thread나 멀티 프로세스 처리가 병렬 처리이고 비동기는 Event Loop와 같은 처리 방식이 있습니다.

그런데 Thread가 완벽한 병렬 처리이냐는 Context switching 때문에 작은 차이는 있을 수 있지만, 일반적으로 병렬 처리로 분류 됩니다. 실제로 Context switching이 병렬 성능에 한계를 가져다 줄수는 있지만, 이건 수백개 이상의 Thread가 동시에 수행될 때의 문제이고, 일반적으로는 Threading은 동시에 작업하는 것처럼 보이게 하는 병렬 처리 방식입니다.

요약하자면, 병렬처리는 동시성 처리의 한 방식이고, Thread, Thread Pool, 멀티 프로세싱은 이러한 동시성 처리를 위한 병렬처리의 대표적인 방식입니다. 다만 OS 측면에서 완벽하게 병렬 처리를 하느냐를 끝까지 따지고 든다면, Thread/ThreadPool은 Context switching 제약이 있다고 말씀 드릴 수 있을 것 같습니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. kristin님.

강의 잘 듣고 계신다니 기쁩니다. 동시성과 병렬성의 차이점은 백엔드 개발에서 중요한 주제이기에 이해가 필요합니다.

우선, 일반적으로 ThreadPool을 사용하는 경우, 이는 CPU-bound 작업보다는 I/O-bound 작업에 유리하게 설계되어 있습니다. 이 방식에서는 여러 개의 스레드를 미리 생성해두고, 각각의 스레드가 대기 중인 상태에서 요청을 처리하게 됩니다. 다만, 이 ‘대기 중’인 스레드가 실제로 ‘유휴 상태’라는 의미에서 자원을 전혀 사용하지 않는 것은 아니며, context switching을 통해 여러 작업이 번갈아 가며 수행되는 특성이 있습니다.

실제로 완전한 병렬성을 경험하기 위해서는 다중 프로세싱 혹은 여러 CPU 코어를 활용한 방식이 적합합니다. 반면, ThreadPoolExecutor는 대개 단일 프로세스 내 여러 스레드 관리를 통해 동시성(Concurrency)을 달성하려는 것입니다. 이 경우 여러 스레드가 서로 다른 타임 슬라이스에서 동작하며, 이는 시스템이 동작을 병렬적으로 수행하는 것처럼 보여 줍니다.

확실한 동시성을 의도할 때는 비동기적인 코드 작성과 이벤트 루프를 활용하는 방법도 고려해보실 수 있습니다.

이 주제와 관련하여 더 명확하게 설명된 자료가 필요하시다면, 추가적으로 다음 URL을 참고해 보시는 것을 권장드립니다:
- Python ThreadPoolExecutor Basics

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kristin님의 프로필 이미지
kristin

작성한 질문수

질문하기