인프런 커뮤니티 질문&답변
비동기처리와 멀티스레드
작성
·
23
0
안녕하십니까 강사님! 오늘도 감사히 강의를 듣고 있습니다.
fastapi는 비동기처리로 효율적으로 처리한다해서 자바쪽은 어떻게 할까 궁금해서 조사만 해봤는데 멀티스레드로 병렬처리로써 효율적으로 처리한다고 알게되었습니다.
그러나 궁금한 점이 생겼습니다. fastapi에서 io작업같이 오래 걸리는 부분에 비동기 처리를 하는건 이해했는데 왜 단순 서비스로직 같은 경우에서는 비동기처리를 사용안하는지 궁금합니다.
제 생각에는 단순히 생각해서 모든 처리를 비동기처리 해도 될 거 같은데 왜 그렇게 안하는지 어떠한 부분에서 문제가 발생할 수 있는지 궁금합니다.
또한 만약에 비동기처리를 안하고 동기처리로 할때 멀티스레드로 하는지도 궁금합니다.
아니면 혹시 서비스 로직같은 단순 cpu연산을 사용할때는 워낙 연산 속도가 빠르니 비동기처리와 동기처리가 속도차이가 없어서 그러한 부분들을 고려하지 않아도 되는지 이런 차이들이 궁금합니다!
항상 좋은 강의 감사드리며 정말 저에겐 소중한 강의입니다!
답변 2
1
안녕하십니까, 강의 칭찬해 주셔서 넘 감사드립니다 ^^
FastAPI는 사용자 Request를 처리할 때 프레임워크에서 비동기 또는 동기 처리를 선택할 수 있게 구성되어 있습니다. Java 계열의 웹 프레임워크(예: 스프링)은 병렬 스레드 기반으로 여러 사용자 Request를 개별 스레드들이 처리하는 방식을 취하고 있고,
FastAPI는 사용자 Request를 처리할 때 프레임워크에서 비동기 또는 동기 처리를 선택할 수 있게 구성되어 있습니다. 즉 IO 처리는 물론이고 단순 서비스 로직에서도 비동기 처리를 수행할 수 있습니다.
동기로 수행할 건지, 비동기로 수행할 건지의 개략적인 File 이나 DB와 같이 I/O를 많이 소모하거나, CPU 계산을 많이 필요로 하는 API는 비동기로 수행해주면 좋습니다.
단순한 서비스의 경우는(예를 들어 수ms내에 응답 처리가 가능한) 비동기로 하던, 동기로 하던 큰 성능 차이는 없습니다. 일괄적으로 async keyword로 비동기 처리를 해주시는게 좀 더 바람직 할 수 는 있지만, async keyword를 함수 선언시 마다 기재하는게 귀찮으면 동기로 처리하셔도 무방합니다. 하지만 전체적으로 async 처리를 더 권장드립니다.
비동기로 수행하면 단일 스레드 기반의 별도 event loop로 수행되며, 동기로 수행하면 multi thread로 수행 할 수 있습니다. 하지만 파이썬의 multi thread는 Java만큼 가볍지 않고, 효율적이지도 않습니다. 때문에 가급적이면 multi thread 기반 보다는 비동기로 수행해 주시는게 좋습니다.
감사합니다.
네, 전반적으로 맞는 말씀입니다. 다만 "fastapi에서는 동기처리가 가볍지도 않고 효율적이지 않으니" 이 부분만 아래와 같이 다시 정리 드립니다.
Java기반의 웹 프레임워크는 Java에서 lightweight하게 제공되는 병렬 thread를 기반으로 사용자 Request를 동기 기반으로 동시 접속성을 향상 시켜 처리합니다. 파이썬 기반 웹 프레임워크인 Django나 Flask도 동기 기반으로 제공되며 역시 병렬 thread를 통해 동시 접속성을 향상 시킵니다. 그렇지만, 파이썬의 thread는 Java만큼 lightweight하지 않습니다(Lock 메커니즘에서 Process 종속성이 강합니다) 때문에 어느정도 동시 접속 용량에 제약이 있을 수 있습니다.
그래서 FastAPI는 이런 문제를 해결하고자 동기 방식은 물론이고 비동기 방식을 함께 제공합니다.
0
안녕하세요, 인프런 AI 인턴입니다. Jh P님.
FastAPI와 비동기 처리에 대해 질문 주셔서 감사합니다. FastAPI는 비동기 프로그래밍을 통해 I/O 작업에서의 효율성을 높일 수 있습니다. 비동기 처리는 네트워크 I/O, 파일 I/O와 같이 대기 시간이 발생하는 작업에서 특히 유용하며, 이런 작업 동안 다른 코드의 실행을 지속할 수 있게 해줍니다. 그러나 CPU-집약적인 처리에서는 비동기 함수의 이점을 크게 얻지 못할 수 있습니다.
1. 비동기 처리 vs 동기 처리
- 비동기 처리: 주로 I/O 작업에서 유리하며, 이런 작업 동안 CPU는 다른 작업을 수행할 수 있습니다. 이는 웹 요청, 파일 시스템 접근, 데이터베이스 쿼리 등의 처리시 많은 장점을 제공합니다.
- 동기 처리: CPU-집약적인 작업에서는 비동기 처리의 이점이 크지 않기 때문에 동기적 접근이 더 효율적일 수 있습니다. 단일 스레드에서 CPU 연산은 오버헤드 없이 즉시 진행될 수 있습니다.
2. 비동기 처리의 한계
- 모든 작업에 대해 비동기 처리를 적용할 필요가 없으며, 오히려 비효율적일 수 있습니다. 특히, 단순한 계산 로직이나 짧은 함수 호출에서는 비동기 오버헤드가 추가 성능 이익보다 클 수 있습니다.
3. 멀티스레드와 동기 처리
- 멀티스레드는 CPU의 멀티코어 구조를 활용하여 여러 프로세스를 병렬 처리하는 방법입니다. 단순 서비스 로직의 경우, 멀티스레딩은 복잡성을 증가시키지 않고도 효과적인 병렬 처리를 가능하게 합니다.
이러한 점들을 고려할 때, 비동기 처리는 주로 시간이 많이 걸리는 I/O 작업에 사용되며, CPU 효율성 측면에서는 동기적 처리 방식이 더 나을 수 있습니다.
질문에 대한 보다 자세한 설명은 권철민 강사님의 FastAPI 강좌 fastapi의 가능성에 대해 궁금합니다를 참고해 보시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






답변주셔서 감사합니다!
답변을 기반으로 정리해서 다시 여쭈어보자면 fastapi에서는 동기처리가 가볍지도 않고 효율적이지 않으니 모든 코드를 비동기함수로 작성이 가능하고 그것을 권장하나 라이브러리에서 정의된 함수에서 동기처리와 비동기처리 중 어떤 것을 지원하는지 잘 구분하여 사용하면 나름 근거있게 비동기처리로 사용하는 것이 맞을까요?
다시 한번 답변 정말 감사드립니다!