- 파이썬의 비동기 프로그래밍은 여러 I/O 중심 작업이 서로를 차단하지 않고 진행될 수 있도록 합니다.
async,await그리고 이벤트 루프. - 같은 도구를 사용하여
asyncio,aiohttp비동기 컨텍스트 관리자와 비동기 반복을 통해 확장 가능한 네트워킹과 API 집약적인 워크로드를 처리할 수 있습니다. - 비동기 방식은 네트워크 및 파일 I/O에 탁월하지만, CPU 집약적인 작업에는 멀티프로세싱이나 특수 서비스를 함께 사용하는 것이 좋습니다.
- 차단 호출을 피하고, 동시 실행을 제한하며, 작업별로 오류를 처리하는 등의 모범 사례는 안정적인 비동기 애플리케이션을 작성하는 데 핵심입니다.
파이썬의 비동기 프로그래밍은 이제 틈새 분야였던 것이 현대적이고 반응형 애플리케이션을 구축하는 모든 사람에게 필수적인 핵심 기술 중 하나가 되었습니다. 웹 API, 마이크로서비스, 실시간 대시보드 또는 입출력(I/O) 작업이 많은 환경에서 작업하다 보면 코드가 실제 작업을 수행하는 시간보다 대기하는 시간이 더 많은 상황에 직면하게 됩니다. 바로 이러한 상황에서 비동기 기법이 빛을 발합니다.
네트워크, 디스크 또는 외부 서비스를 기다리는 동안 프로그램이 유휴 상태로 있도록 두는 대신, 비동기 코드를 사용하면 이러한 대기 시간을 중첩시켜 애플리케이션을 계속 실행할 수 있습니다. 이 가이드에서는 파이썬에서 비동기 처리가 어떻게 작동하는지, 어떤 문제를 해결하는지, 언제 유용하고 언제 적절하지 않은 도구인지 자세히 살펴보고, 구체적인 예제를 통해 알아보겠습니다. async, await, asyncio 그리고 다음과 같은 인기 있는 비동기 라이브러리 aiohttp.
파이썬에서 비동기 프로그래밍이란 무엇인가요?
본질적으로 비동기 프로그래밍은 여러 작업이 단일 운영 체제 스레드를 공유하더라도 서로를 차단하지 않고 진행될 수 있도록 코드를 구성하는 방식입니다. 기존의 동기식 방식에서는 각 작업이 완료되어야 다음 작업이 시작됩니다. 즉, API를 호출하고, 기다리고, 응답을 파싱한 후에야 다음 작업으로 넘어갈 수 있습니다. 반면 비동기식 코드를 사용하면 여러 개의 장시간 실행 작업을 동시에 실행하고, 파이썬이 특정 작업이 대기 중일 때 다른 작업으로 전환할 수 있습니다.
파이썬은 특수한 구문과 이벤트 루프를 중심으로 구축된 협력적 스케줄러를 조합하여 이 모델을 구현합니다. 이 모든 것을 가능하게 하는 두 가지 핵심 키워드는 다음과 같습니다. async await함수를 비동기식으로 표시하려면 다음을 사용합니다. async def그리고 당신은 그 안에서 잠시 멈춥니다. await 이벤트 루프로 제어권을 되돌려줄 수 있는 작업을 만날 때마다.
An async def 이 함수는 값을 직접 반환하지 않고, 실행을 예약하고 기다릴 수 있는 계산을 나타내는 코루틴 객체를 반환합니다. 때 사용 await 해당 함수 내부에서 파이썬은 현재 코루틴을 일시 중단하고 대기 중인 작업(예: 네트워크 요청)이 완료될 때까지 다른 보류 중인 작업이 실행되도록 합니다. 그런 다음 코루틴 실행이 재개됩니다. await.
이것이 중요합니다. 비동기 파이썬 코드는 일반적으로 여전히 단일 스레드이지만, 여러 작업이 겹치는 시간 창에서 진행된다는 점에서 동시성을 갖습니다. 한 작업이 I/O를 기다리는 동안 다른 작업은 CPU 시간을 얻습니다. 이것이 바로 비동기 방식이 I/O 집약적인 작업에 적합한 이유이지만, CPU 집약적인 작업을 마법처럼 가속화하는 것은 아닙니다.
구체적인 비유: 체스 시범경기와 대기 시간
파이썬 커뮤니티에서 동시 실행과 순차 실행을 설명하기 위해 자주 사용되는 고전적인 비유는 동시에 진행되는 체스 시범 경기입니다. 그랜드마스터가 24명의 아마추어와 대결하는 상황을 상상해 보세요. 그녀는 동기식 전략과 비동기식 전략을 반영하여 두 가지 다른 방식으로 이벤트를 진행할 수 있습니다.
동시 진행 방식에서는 그녀가 한 명의 상대와 앉아서 처음부터 끝까지 그 게임 하나만 플레이한 후 다음 테이블로 이동합니다. 그녀가 한 수를 둘 때마다 5초가 걸리는 반면, 아마추어 선수들은 생각하는 데 평균 55초를 소비합니다. 일반적인 게임은 30번의 수 교환(총 60수)으로 이루어집니다. 즉, 한 게임은 (55 + 5) × 30 = 1800초, 약 30분 동안 진행됩니다. 24게임이 진행되면 전체 대회는 12시간 동안 이어집니다.
비동기 버전에서 그녀는 방을 돌아다니며 각 보드에서 한 수씩 둔 다음, 현재 상대방이 대응책을 생각하는 동안 즉시 다음 보드로 이동합니다. 24개의 보드에서 한 라운드를 진행하는 데 24 × 5 = 120초, 즉 2분이 소요됩니다. 이렇게 30라운드를 진행하면 전체 게임 세트가 대략 3600초, 즉 1시간 만에 완료됩니다.
핵심은 그녀의 기본적인 경기 속도는 전혀 변하지 않았다는 점입니다. 달라진 것은 상대방의 대기 시간을 어떻게 활용하느냐였습니다. 비동기 파이썬 코드도 같은 원리를 따릅니다. 즉, I/O 속도를 향상시키지는 않지만, 네트워크, 디스크 또는 외부 리소스를 기다리는 동안 유용한 작업을 수행할 수 있도록 해줍니다.
동기 요청과 비동기 요청: API를 활용한 실제 사례
파이썬에서 비동기 처리를 사용하는 가장 일반적인 사례 중 하나는 외부 API를 처리하는 것인데, 이때 각 요청은 수백 밀리초 이상 소요될 수 있습니다. 예를 들어, GitHub의 공개 API를 사용하여 여러 GitHub 계정의 팔로워 수를 가져오고 싶다고 가정해 보겠습니다.
간단한 동기식 접근 방식은 널리 사용되는 차단형 HTTP 클라이언트를 사용하는 것입니다. requests. 루프를 사용하여 각 사용자 엔드포인트에 대해 GET 요청을 수행하고, JSON 페이로드를 읽고, 정보를 추출합니다. followers 입력값을 입력받아 출력하거나 저장합니다. 이 방식은 간단하고 읽기 쉽지만 단점이 있습니다. 프로그램은 처리하는 계정마다 요청을 수행하고 응답을 기다린 후에야 다음 요청을 시작합니다.
그러니까 세 명의 사용자를 확인해 보세요. api.github.com/users/python, api.github.com/users/google api.github.com/users/firebase코드는 첫 번째 요청을 보내고, GitHub의 응답을 기다린 후 두 번째 요청으로 넘어가는 식으로 진행됩니다. 사용자가 소수라면 괜찮을 수 있지만, 사용자 목록이 수백 또는 수천 명으로 늘어나면 앱이 원격 서버를 기다리며 대부분의 시간을 유휴 상태로 보내기 때문에 전체 처리 시간이 급격히 증가합니다.
속도를 높이려면 비동기 구현으로 전환하면 됩니다. asyncio 그리고 비동기 기능을 지원하는 HTTP 클라이언트와 같은 것 aiohttp. 이 모델에서는 여러 코루틴 작업을 실행하여 거의 동시에 HTTP 요청을 보냅니다. 이벤트 루프는 각 요청의 응답을 기다렸다가 데이터가 도착하면 각 작업을 재개합니다. 즉, 이전 요청이 완전히 완료될 때까지 기다렸다가 다음 요청을 시작하는 방식이 아닙니다.
이 두 가지 접근 방식을 나란히 비교 테스트해 보면, 특히 사용자 수가 증가할수록 비동기 버전이 큰 차이로 우위를 차지하는 경우가 많습니다. 요청당 소요 시간은 변하지 않지만, 여러 연결을 순차적으로 처리하는 대신 동시에 처리하기 때문에 모든 결과를 얻는 데 걸리는 총 시간이 크게 단축됩니다.
핵심 개념: 코루틴, 이벤트 루프, 태스크 및 퓨처
내부적으로 최신 비동기 파이썬은 주로 다음에서 제공하는 몇 가지 핵심 구성 요소를 중심으로 작동합니다. asyncio 기준 치수. 이러한 개념들을 이해하면 나머지 생태계가 훨씬 덜 복잡해지고 견고한 비동기 아키텍처를 설계하는 데 도움이 될 것입니다.
코루틴은 실행을 일시 중지했다가 다시 시작할 수 있는 특별한 종류의 함수입니다. 오늘날의 구문에서는 다음과 같이 정의합니다. async def이 함수를 호출하면 대기하거나 스케줄링해야 하는 코루틴 객체가 반환됩니다. 일반 함수처럼 즉시 실행되지 않습니다. 내부에서는 사용할 때마다 await 파이썬은 대기 가능한 대상(다른 코루틴, 작업, 퓨처 등)이 있을 때, 대기 중인 작업이 완료될 때까지 해당 코루틴을 일시 중단합니다.
이벤트 루프는 모든 대기 중인 코루틴, I/O 작업 및 타이머를 추적하고 특정 시점에 어떤 코드가 실행될지 결정하는 역할을 합니다. 과거에는 루프를 명시적으로 얻고 관리해야 했습니다. asyncio.get_event_loop()하지만 현대 파이썬 코드에서는 다음과 같은 패턴이 선호됩니다. asyncio.run() 최상위 비동기 함수를 중심으로 루프를 생성, 실행 및 종료합니다. main().
태스크는 코루틴을 감싸는 래퍼로, 이벤트 루프에 해당 태스크의 실행을 예약하도록 지시합니다. 이러한 작업은 가벼운 작업이라고 생각할 수 있습니다. 루프는 여러 스레드를 생성하지 않고도 여러 작업 간에 진행 상황을 번갈아 처리할 수 있습니다. 일반적으로 다음과 같은 방식으로 작업을 생성합니다. asyncio.create_task() 또는 다음과 같은 도우미를 호출하여 asyncio.gather()이는 내부적으로 여러 작업을 관리합니다.
퓨처스는 자바스크립트의 프로미스와 유사하게 나중에 사용 가능해질 결과를 나타냅니다. 작업과 미래는 모두 기다릴 수 있는 객체입니다. await 기본 작업이 완료될 때까지 해당 작업을 일시 중단합니다. 이 통합 프로토콜 덕분에 비동기 흐름을 구성하는 것이 올바른 객체를 올바른 순서로 기다리는 것으로 귀결되므로 오케스트레이션 코드가 훨씬 간단해집니다.
비동기 구문의 실제 활용: async, await, async with async for
The async `async` 키워드는 함수 정의에만 국한되지 않고 컨텍스트 관리자 및 반복문에도 적용되어 고급 패턴들이 비동기 세계에 참여할 수 있도록 합니다. 이 확장된 구문을 알면 네트워크 연결, 세션, 스트림 및 사용자 지정 프로토콜과 관련된 코드를 더욱 깔끔하게 작성할 수 있습니다.
가장 흔한 형태는 다음과 같습니다. async def이는 비동기 함수(코루틴 팩토리)를 정의합니다. 이러한 함수 내부에서는 자유롭게 사용하게 될 것입니다. await 다른 코루틴이나 대기 가능한 작업을 호출할 때마다, 예를 들어 asyncio.sleep()비동기 HTTP 요청이나 비동기 데이터베이스 쿼리를 사용할 수 없습니다. 단, 다음과 같은 경우에는 사용할 수 없습니다. await 스크립트의 최상위 레벨에 바로 위치해야 하며, 반드시 그 안에 있어야 합니다. async def.
전화를 걸고 싶은 유혹이 들겠지만 time.sleep() 지연을 위해 코루틴 내부에 코드를 삽입하는 것은 비동기 방식을 사용하는 목적 자체를 완전히 무산시키는 것입니다. time.sleep() 이 방식은 이벤트 루프를 포함한 전체 스레드를 차단하므로 해당 시간 동안 다른 비동기 작업이 진행될 수 없습니다. 대신, 비차단 방식의 함수를 사용해야 합니다. asyncio.sleep()타이머가 카운트다운되는 동안 제어권이 다시 루프로 돌아갑니다.
Python은 또한 비동기 컨텍스트 관리자를 지원합니다. async with특수 메서드를 정의함으로써 구현됩니다. __aenter__ __aexit__. 이는 네트워크 세션 열기 또는 비동기 리소스 획득과 같이 비동기 작업을 포함하는 깔끔한 설정 및 해제 시퀀스가 필요한 객체를 다룰 때 특히 유용합니다. 일반적인 예로는 객체 관리가 있습니다. aiohttp.ClientSession 또는 개별 HTTP 요청을 사용하여 async with 수동으로 호출하는 대신 블록을 사용합니다. close().
마지막으로 비동기 반복은 다음을 통해 제공됩니다. async for마법적인 방법에 의존하는 __aiter__ __anext__ PEP 492에 설명되어 있습니다. 비동기 이터레이터와 비동기 제너레이터를 사용하면 시간에 따라 항목을 순차적으로 반환할 수 있습니다. await 반복 프로세스 내부에 있으며, 이는 네트워크 또는 다른 비동기 소스에서 점진적으로 도착하는 스트리밍 데이터에 적합합니다.
여러 작업을 동시에 실행하기 asyncio
비동기 프로그래밍의 진정한 힘은 I/O 중심 작업을 하나씩 순차적으로 실행하는 것이 아니라 여러 작업을 동시에 실행할 때 드러납니다. 파이썬의 비동기 생태계에서 이를 위한 주요 도구는 다음과 같습니다. asyncio.create_task() asyncio.gather()둘 다 이벤트 루프에서 코루틴을 예약합니다.
와 asyncio.gather()여러 코루틴을 한 번에 실행하고 모든 코루틴이 완료될 때까지 기다린 후 결과를 리스트 또는 튜플로 받을 수 있습니다. 이는 HTTP 호출 일괄 처리, 데이터베이스 쿼리 또는 반복적인 비동기 작업에서 매우 흔하게 발생합니다. 내부적으로는 다음과 같은 과정이 진행됩니다. gather() 각 코루틴을 태스크로 묶고 모든 코루틴이 완료되도록 합니다.
GitHub 프로필을 가져오는 예시로 돌아가서, 이를 다음과 같이 리팩토링하면 됩니다. aiohttp asyncio.gather()그러면 다음과 같은 함수 호출이 세 번 발생하게 됩니다. fetch_user() 동시에 출시되고 있습니다. 각 작업은 HTTP 요청을 시작하고, 데이터를 기다리는 동안 제어권을 넘겨준 다음, 응답이 도착하면 파싱을 재개합니다. 사용자 입장에서는 세 가지 결과가 거의 동시에 표시됩니다.
하지만 경우에 따라서는 수천 또는 수백만 개의 작업을 한 번에 실행하고 싶지 않을 수도 있습니다. 그렇게 하면 컴퓨터에 과부하가 걸리거나 외부 속도 제한에 걸릴 수 있기 때문입니다. 일반적인 패턴은 특정 작업만 처리하여 동시 처리량을 제한하는 것입니다. MAX_TASKS 세마포어, 제한된 풀 또는 비동기 워크플로 내의 수동 배치 로직을 사용하여 한 번에 여러 작업을 처리할 수 있습니다.
여러 작업을 동시에 실행할 때 또 다른 중요한 측면은 오류 처리 방식입니다. 단 하나의 요청 실패로 전체 배치 작업이 중단되는 것은 실제 애플리케이션에서는 거의 용납되지 않습니다. 이상적으로는 비동기 오케스트레이션이 작업별로 예외를 포착하고 관리해야 하며, 예외를 로깅하거나, 선택적으로 재시도하거나, 나머지 배치 결과를 그대로 유지하면서 부분적인 결과만 반환하는 등의 조치를 취할 수 있습니다.
동시성 처리: 장점과 단점
동시성과 병렬성이라는 개념을 명확히 구분하는 것이 중요합니다. 파이썬의 비동기 처리는 동시성을 제공하지만 병렬성을 반드시 보장하는 것은 아니기 때문입니다. 동시성은 여러 작업이 겹치는 시간 간격을 두고 진행되는 것을 의미하며, 병렬성은 여러 CPU 코어에서 말 그대로 동시에 실행되는 것을 의미합니다.
일반적인 비동기 코드 사용 asyncio 여러 개의 OS 스레드를 생성하는 것이 아니라, 각 스레드가 I/O 작업으로 인해 블록될 때를 기준으로 단일 스레드 내에서 작업을 다중화합니다. Node.js로 프로그래밍하기. 그렇기 때문에 수천 개의 연결에서도 확장성이 매우 뛰어납니다. 컨텍스트 전환은 운영 체제가 아닌 이벤트 루프에 의해 제어되고 협력적으로 이루어지기 때문에 비용이 저렴합니다.
이 설계에는 특히 조정 및 예외 처리 측면에서 어려움이 따릅니다. 이제 로직이 시간적으로 섞여 실행되는 여러 코루틴에 분산되어 있으므로 상태 공유, 오류 전파 및 리소스 정리 시 더욱 신중해야 합니다. '잊혀진'과 같은 버그가 발생할 수 있습니다. await대기하지 않는 작업이나 백그라운드 작업에서 조용히 처리되는 예외는 미묘하고 디버깅하기 어려울 수 있습니다.
비동기 코드베이스의 유지보수성을 높이려면 견고한 엔지니어링 관행을 따라야 합니다. 코루틴은 단일 책임에 집중하고, 가능한 한 오류 처리를 중앙 집중화하며, 런타임에 무슨 일이 발생하는지 이해할 수 있도록 적절한 로깅을 추가해야 합니다. 훌륭한 도구와 명확한 규칙은 단일 스레드 비동기 환경에서도 경쟁 조건과 같은 문제나 리소스 누수를 방지하는 데 큰 도움이 됩니다.
비동기 코드가 정말 도움이 되는 경우와 그렇지 않은 경우
비동기 프로그래밍은 I/O 중심적인 워크로드에 매우 효과적이지만, 모든 성능 문제를 해결하는 만능 해결책은 아닙니다. 최적화 작업의 첫 번째 단계는 병목 현상이 I/O에서 발생하는지 아니면 CPU 집약적인 연산에서 발생하는지 파악하는 것입니다.
애플리케이션이 네트워크 응답을 기다리거나, 파일을 읽고 쓰거나, 데이터베이스를 조회하거나, 소켓을 통해 통신하는 데 대부분의 시간을 소비한다면 비동기 방식이 거의 확실히 적합합니다. 대표적인 예로는 여러 외부 서비스와 통신하는 웹 API, 여러 데이터 소스에서 동시에 읽고 쓰는 ETL 파이프라인, 그리고 여러 클라이언트 연결을 동시에 유지하는 마이크로서비스 등이 있습니다.
반면, 수치 계산, 이미지 처리 또는 복잡한 시뮬레이션과 같이 CPU 사용량이 많은 작업이 대부분을 차지하는 경우 비동기 방식만으로는 속도를 향상시킬 수 없습니다. 이러한 시나리오에서는 GIL(전역 인터프리터 잠금)로 인해 단일 파이썬 프로세스 내에서 병렬로 실행할 수 있는 작업이 여전히 제한됩니다. 일반적으로 멀티프로세싱, 네이티브 확장 기능 또는 특수 백엔드 활용을 통해 더 나은 결과를 얻을 수 있습니다.
기업 환경에서 실용적인 전략은 이러한 기술들을 결합하는 것입니다. 즉, asyncio와 클라우드 서비스(AWS, Azure 등)용 비동기 SDK를 사용하여 지연 시간을 최소화하고 처리량을 극대화하는 동시에 CPU 집약적인 작업은 별도의 프로세스, 워커 또는 관리형 컴퓨팅 서비스에 위임하는 것입니다. 이렇게 하면 언어 런타임과 싸우는 대신 각 도구의 강점을 활용할 수 있습니다.
비동기 파이썬 작성을 위한 모범 사례
비동기 프로그래밍을 더 폭넓게 도입하기 시작하면, 특정 패턴과 습관을 통해 가장 흔한 함정을 피할 수 있습니다. 또한 비동기 환경에 아직 익숙하지 않은 팀원들이 코드를 더 쉽게 이해할 수 있도록 도와줍니다.
기본 원칙은 비동기 코드 경로에서 블로킹 호출을 피하는 것입니다. 즉, 다음과 같은 것들을 교체하는 것을 의미합니다. time.sleep() 과 await asyncio.sleep()또한 비동기 API를 제공하지 않는 라이브러리를 사용할 때는 주의해야 합니다. 타사 패키지가 완전히 동기식으로 작동하는 경우, 코루틴에서 해당 패키지를 광범위하게 호출하면 이벤트 루프가 차단되어 동시성 이점을 잃을 수 있습니다.
여러 개의 독립적인 I/O 작업을 일괄 처리해야 할 때는 유틸리티를 사용하여 동시에 실행하는 것이 좋습니다. asyncio.gather() 또는 최대 동시 실행 수준으로 제한된 작업 풀. 이 패턴은 열린 연결 수 또는 진행 중인 요청 수를 제어하면서 처리량을 증가시킵니다.
설계 지침으로, 코루틴은 깔끔한 동기 코드에서 함수를 설계하는 방식과 유사하게 비교적 작고 명확한 책임에 집중하도록 설계하는 것이 좋습니다. 네트워킹, 비즈니스 로직 및 오류 처리를 혼합한 대규모 단일 코루틴은 특히 중간에 오류가 발생할 경우 테스트 및 분석이 매우 어려워집니다.
마지막으로, 여러분이 의존하는 생태계 구성 요소들이 비동기 사용을 실제로 지원하는지 항상 확인하십시오. 많은 인기 라이브러리는 별도의 비동기 클라이언트나 전용 서브모듈을 제공하지만, "비동기" 기능을 지원한다고 광고하는 라이브러리라도 내부적으로는 여전히 블로킹 방식을 사용할 수 있습니다. 문서를 꼼꼼히 읽고 간단한 벤치마크를 실행하면 미묘한 성능 저하를 방지할 수 있습니다.
실제 사용 시나리오 및 아키텍처 아이디어
실제 소프트웨어 프로젝트에서 비동기 방식은 기존 웹 백엔드부터 최첨단 AI 기반 시스템에 이르기까지 다양한 아키텍처에서 뛰어난 성능을 발휘합니다. 공통적인 요소는 항상 유휴 대기 시간으로 시간을 낭비하지 않고 많은 I/O 바운드 작업을 처리해야 한다는 필요성입니다.
대표적인 시나리오 중 하나는 클라이언트에게 단일 응답을 제공하기 위해 여러 외부 API를 호출해야 하는 웹 서비스입니다. 비동기 방식을 사용하면 서비스는 모든 외부 요청을 한 번에 실행하고 각 구성 요소가 도착하는 즉시 최종 페이로드를 조립할 수 있으므로 전체 응답 시간을 크게 단축할 수 있습니다. 이는 마이크로서비스 아키텍처 및 결제 게이트웨이, 소셜 네트워크 또는 분석 플랫폼과의 통합에서 흔히 사용됩니다.
또 다른 중요한 활용 사례는 데이터 엔지니어링입니다. 파이프라인과 ETL 작업은 여러 데이터베이스, 파일 시스템 또는 클라우드 스토리지 버킷과 병렬로 상호 작용하는 경우가 많습니다. 여러 소스에서 동시에 데이터를 읽고 결과가 준비되는 즉시 기록함으로써 전반적인 지연 시간을 줄이고 사용 가능한 대역폭을 더 효율적으로 활용할 수 있습니다. 특히 클라우드 스토리지나 REST 기반 데이터 API를 사용할 때 이러한 이점이 두드러집니다.
비동기 방식은 백엔드가 장시간 실행되는 HTTP 연결을 차단하지 않고 여러 서비스의 데이터를 집계해야 하는 Power BI와 같은 비즈니스 인텔리전스 대시보드 및 도구와도 잘 어울립니다. 사용자 지정 API 레이어 또는 통합 마이크로서비스를 구축하려면 다음을 사용하세요. asyncio 부하가 걸린 상황에서 체감되는 응답성과 처리량을 향상시킬 수 있습니다.
맞춤형 소프트웨어, 인공지능, 사이버 보안 및 클라우드 컨설팅을 전문으로 하는 기업들은 AI 모델 호출, 이벤트 로깅, 위협 모니터링 및 클라우드 제어 영역과의 통신을 포함하는 워크플로우를 구성하기 위해 비동기 기술에 크게 의존하는 경우가 많습니다. 비동기 I/O를 활용한 오케스트레이션과 CPU 최적화 워커를 별도로 사용하여 고성능 작업을 처리하는 방식은 확장성과 유지보수성이 뛰어난 시스템을 구축하는 데 널리 사용되는 내부 패턴입니다.
많은 개발자와 팀에게 있어 첫 번째 단계는 애플리케이션에서 "I/O 바운드"가 분명한 부분에 비동기 처리를 도입하는 것입니다. 그런 다음 이점이 명확해지고 팀이 해당 패러다임과 도구에 대한 자신감을 얻게 되면 단계적으로 개선해 나가면 됩니다.
궁극적으로 파이썬의 비동기 프로그래밍은 대기 시간을 현명하게 활용하는 것입니다. 즉, 코드를 다음과 같이 구조화하는 것입니다. async, await코루틴과 이벤트 루프를 사용하면 특히 네트워크, 파일 및 외부 서비스를 처리할 때 더 빠르고, 부하 시 확장성이 뛰어나며, 사용 가능한 리소스를 최대한 활용하는 애플리케이션을 구축할 수 있습니다.
