Synchronous vs Asynchronous ( 동기 vs 비동기 ) 방식

2025. 2. 5. 15:22Network 공부

Synchronous ( 동기 방식 )

 Requset 가 들어오면 해당 작업이 끝날 때까지 기다린 후 다음 작업을 처리하는 방식

순차적(Blocking) 처리 방식으로 하나의 요청이 끝나야 다음 요청을 처리할 수 있다.

 

동기 방식 예제 (Python)

import time

def task1():
    print("Task 1 시작")
    time.sleep(3)  # 3초 대기
    print("Task 1 완료")

def task2():
    print("Task 2 시작")
    time.sleep(2)  # 2초 대기
    print("Task 2 완료")

task1()
task2()
print("모든 작업 완료")

실행 결과

Task 1 시작
(3초 후)
Task 1 완료
Task 2 시작
(2초 후)
Task 2 완료
모든 작업 완료

단점:

각 작업이 끝날 때까지 기다려야 하므로 속도가 느림.
다중 요청을 동시에 처리하기 어려움.

 

Asynchronous ( 비동기 방식 )

Request 를 보낸 후 즉시 Return 하며, 작업이 완료되면 나중에 결과를 반환하는 방식

Non - Blocking 방식으로 하나의 요청이 끝날 때까지 기다리지 않는다.

대량의 요청을 빠르게 처리 가능하며, CPU 와 메모리 사용이 효율적이다.

 

* "즉시 반환(Return)"이란, 요청(Request)을 보낸 후 작업이 끝날 때까지 기다리지 않고, 곧바로 다음 작업을 수행하는 것을 의미한다.
요청을 보내자마자 "작업이 완료되지 않았어도" 서버나 프로그램이 다른 작업을 할 수 있도록 진행하는 방식이다.

비동기 방식 예제 (Python asyncio)

import asyncio

async def task1():
    print("Task 1 시작")
    await asyncio.sleep(3)  # 3초 대기
    print("Task 1 완료")

async def task2():
    print("Task 2 시작")
    await asyncio.sleep(2)  # 2초 대기
    print("Task 2 완료")

async def main():
    await asyncio.gather(task1(), task2())  # 두 개의 작업을 동시에 실행

asyncio.run(main())
print("모든 작업 완료")

실행 결과 (총 3초 소요)

Task 1 시작
Task 2 시작
(2초 후)
Task 2 완료
(1초 후)
Task 1 완료
모든 작업 완료

장점:

여러 작업을 동시에 실행할 수 있어 빠름.

I/O 작업(파일 읽기, 네트워크 요청)에서 대기 시간을 줄일 수 있음.

Nginx, Node.js 같은 고성능 서버에서 많이 사용됨.

 


 

Asynchronous Event-Driven System

비동기 이벤트 기반 시스템은 "이벤트(Event)가 발생하면 실행되는 방식"이다.
요청이 들어오면 바로 처리하지 않고, 나중에 실행할 작업을 예약(Queue)해 두고 나중에 실행된다.

 

비동기 이벤트 기반 동작 방식
- 클라이언트가 요청(Request)을 보냄.
- 서버는 요청을 이벤트 큐(Event Queue)에 추가하고 즉시 반환.
- 이벤트 루프(Event Loop)가 큐에서 요청을 하나씩 꺼내어 처리.
- 작업이 완료되면 클라이언트에게 응답(Response) 반환.

 

 비동기 이벤트 루프(Event Loop)
이벤트 루프(Event Loop)는 비동기 이벤트 기반 시스템의 핵심 요소이다.
이벤트가 발생하면 즉시 처리하지 않고, 이벤트 큐(Event Queue)에 저장했다가 실행한다.

- 이벤트 루프 예제 (Python asyncio)

import asyncio
async def async_task(name, delay):
   print(f"{name} 시작")
   await asyncio.sleep(delay)
   print(f"{name} 완료")

async def main():
   task1 = asyncio.create_task(async_task("작업 1", 3))
   task2 = asyncio.create_task(async_task("작업 2", 2))

   await task1
   await task2

asyncio.run(main())

- 실행 결과

작업 1 시작
작업 2 시작
(2초 후)
작업 2 완료
(1초 후)
작업 1 완료

이벤트 루프는 "작업이 끝날 때까지 기다리지 않고, 여러 작업을 동시에 실행한다."

 

 

비동기 이벤트 기반이 필요한 경우

- 대량의 요청을 동시에 처리해야 하는 경우 (예: 뉴스, 검색엔진, 스트리밍 서버)
- 서버 부하를 최소화하고 높은 성능이 필요한 경우
- 리버스 프록시(Reverse Proxy) 및 로드 밸런서를 사용할 경우
- 웹소켓(WebSockets) 또는 실시간 데이터 처리가 필요한 경우 (예: 채팅, 게임 서버)

 

 

대표적인 비동기 이벤트 기반 프레임워크:

Nginx (웹 서버)
Node.js (비동기 JavaScript 서버)
Go 언어 (Goroutine을 사용한 비동기 처리)
Python asyncio (비동기 프로그래밍 지원)

'Network 공부' 카테고리의 다른 글

왜 HTTP는 Statless 인가??  (0) 2025.02.06
Multi Process vs Multi Thread  (0) 2025.02.05
ACL (Access Control List)  (0) 2025.02.05
Static Request vs Dynamic Request  (1) 2025.02.04
SSH(Secure Shell)  (0) 2025.02.04