비동기 처리와 이벤트 루프 (Asynchronous Programming and Event Loop)

컴퓨터과학·AI
한 줄 정의: 시간이 걸리는 작업의 완료를 기다리지 않고 다른 일을 먼저 처리한 뒤, 그 작업이 끝나면 결과를 처리하도록 계속 순회하며 확인하는 프로그램 실행 방식입니다.

쉽게 풀면

식당 종업원을 생각해 봅시다. 종업원이 한 테이블의 음식이 나올 때까지 주방 앞에 가만히 서서 기다린다면(동기 처리), 그 사이 다른 손님은 아무도 응대받지 못합니다. 하지만 유능한 종업원은 주문만 넣어두고 곧바로 다른 테이블로 이동해 다른 손님을 받다가, 음식이 준비됐다는 벨이 울리면 그때 가서 서빙합니다(비동기 처리). 이때 "지금 어떤 벨이 울렸는지" 계속 돌아다니며 확인하는 종업원의 순회 동작이 바로 이벤트 루프입니다. 프로그램도 파일 읽기나 네트워크 응답처럼 시간이 걸리는 작업을 기다리는 동안 다른 코드를 실행하고, 작업이 끝나면 이벤트 루프가 그 결과(콜백)를 처리하도록 순서를 조율합니다.

왜 중요한가

웹 서버, 모바일 앱, 분산 시스템처럼 네트워크나 디스크 입출력을 자주 기다려야 하는 소프트웨어에서는 대기 시간이 곧 낭비되는 자원입니다. 비동기 처리와 이벤트 루프는 이 대기 시간을 최소화해 적은 자원으로도 많은 요청을 처리할 수 있게 해주기 때문에, 시스템 성능·확장성 연구나 서버 아키텍처 설계를 다루는 논문에서 핵심 구현 방식으로 자주 언급됩니다. 또한 최근에는 대규모 언어 모델 서빙이나 다중 에이전트 시스템처럼 여러 외부 API 호출을 동시에 기다려야 하는 연구에서도 비동기 설계가 처리량과 응답 지연을 좌우하는 요소로 다뤄집니다.

논문에서는 이렇게 쓰입니다

"제안 시스템은 비동기 처리와 이벤트 루프 기반으로 구현되어, 다수의 네트워크 요청을 동시에 대기하면서도 단일 스레드로 높은 처리량을 달성하였다."

이 문장은 "여러 요청을 각각 별도의 실행 흐름 없이도, 하나의 실행 흐름이 대기 시간을 낭비하지 않고 번갈아 처리하도록 설계해 효율을 높였다"는 뜻입니다.

"본 연구의 크롤링 모듈은 이벤트 루프 기반 비동기 I/O를 활용하여 다수의 웹 페이지 요청을 병행 처리함으로써, 순차적 요청 방식 대비 전체 수집 시간을 크게 단축하였다."

이 문장은 "웹 페이지를 하나씩 순서대로 내려받는 대신, 응답을 기다리는 동안 다음 요청을 미리 보내는 방식으로 데이터 수집 속도를 개선했다"는 뜻입니다.

"제안하는 다중 에이전트 프레임워크는 각 에이전트가 외부 API 응답을 비동기적으로 대기하도록 설계되어, 에이전트 수가 늘어나더라도 전체 시스템의 응답 지연이 완만하게 증가하는 특성을 보였다."

이 문장은 "여러 에이전트가 각각 응답을 기다리느라 시스템 전체가 멈추지 않도록 설계해, 에이전트가 많아져도 성능이 급격히 나빠지지 않았다"는 뜻입니다.

조금 더 깊게 보면

실제 구현체를 보면 비동기 처리는 보통 콜백(callback), 프로미스(promise)/퓨처(future), 그리고 async/await 문법이라는 세 가지 형태로 나타나며, 이들은 표현 방식만 다를 뿐 이벤트 루프가 결과를 나중에 전달한다는 점은 동일합니다. 이벤트 루프는 내부적으로 대기 중인 입출력 작업들을 감시하다가 완료된 작업의 콜백을 큐에 넣고 순서대로 실행하는데, 이 과정에서 콜백이 지나치게 중첩되면 코드 가독성이 떨어지는 "콜백 지옥" 문제가 생길 수 있어 async/await 같은 문법이 도입되었습니다. 논문에서 성능을 논할 때는 흔히 처리량(throughput)과 지연시간(latency), 그리고 동시에 처리 중인 요청 수(concurrency level)를 지표로 삼아 동기 방식과 비교하는 경우가 많습니다.

주의할 점

비동기 처리는 프로세스와 스레드를 여러 개 두어 병렬로 실행하는 것과는 다른 개념입니다. 스레드를 여러 개 쓰는 것은 실제로 여러 작업을 동시에 진행하는 것이지만, 이벤트 루프 기반 비동기 처리는 보통 하나의 실행 흐름 안에서 대기 시간만 겹쳐 쓰는 방식이라, 계산량이 많은 작업 자체를 빠르게 만들어주지는 않습니다.

관련 용어