동기적(synchronous) vs 비동기적(asynchronous)

2025. 3. 21. 12:48·개발 공부

 

🎯 핵심 요약

 

  동기적(Synchronous) 비동기적(Asynchronous)
처리 방식 하나 끝나야 다음 작업 기다리지 않고 바로 다음 작업
예시 줄 서서 계산하기 음식 시키고 다른 일 하기
특징 순차적, 단순 병렬적, 효율적

🛍️ 실생활 예시로 이해해보자

✅ 동기적 예시 – 마트 계산대 줄 서기

  1. 앞사람이 계산할 때까지 넌 기다려야 해
  2. 앞사람이 끝나야 네 계산이 시작돼
  3. 네 계산이 끝나야 다음 사람이 계산 가능

👉 이게 동기적 처리야.
하나 끝나야 다음 작업이 시작돼. 단순하지만 시간이 오래 걸릴 수 있어.


✅ 비동기적 예시 – 배달 음식 시키기

  1. 네가 치킨을 시켜 (이건 시간이 오래 걸려)
  2. 치킨이 오기 전까지 넌 TV도 보고 숙제도 해
  3. 치킨이 오면 띵동~ 하고 알려줘, 그때 먹으면 돼

👉 이게 비동기적 처리야.
치킨(느린 작업)을 기다리는 동안 다른 일도 같이 할 수 있어.


✅ 1. 동기적 처리 (Synchronous)

import time

def slow_task():
    print("⏳ 작업 시작")
    time.sleep(3)  # 3초 동안 기다림
    print("✅ 작업 완료")

def main():
    print("👉 첫 번째 작업")
    slow_task()
    print("👉 두 번째 작업")

main()

🧠 결과:

👉 첫 번째 작업
⏳ 작업 시작
(3초 기다림)
✅ 작업 완료
👉 두 번째 작업

🟡 3초 동안 아무것도 못 하고 멈춰 있어. 이게 동기적 처리야.


✅ 2. 비동기적 처리 (Asynchronous, async + await 사용)

import asyncio

async def slow_task():
    print("⏳ 작업 시작")
    await asyncio.sleep(3)  # 3초 대기 (그 사이 다른 작업 가능)
    print("✅ 작업 완료")

async def main():
    print("👉 첫 번째 작업")
    task = asyncio.create_task(slow_task())  # 작업을 "백그라운드"에 보내기
    print("👉 두 번째 작업")  # 이게 먼저 출력됨!
    await task  # 작업 끝날 때까지 기다리기

asyncio.run(main())

🧠 결과:

👉 첫 번째 작업
👉 두 번째 작업
⏳ 작업 시작
(3초 후)
✅ 작업 완료

🟢 slow_task()는 뒤에서 동작하고, main 함수는 기다리지 않고 다음 줄 실행!


✅ 그림으로 요약

⏱ 동기적

[작업 A 시작] → (기다림) → [작업 A 끝] → [작업 B 시작]

⚡ 비동기적

[작업 A 시작] → [작업 B 시작] → (나중에) → [작업 A 끝]

💬 실전에서는 언제 쓰냐면?

계산기, 수학 함수 동기적
웹 서버가 여러 요청 처리 비동기적
버튼 클릭 후 바로 반응 비동기적
대용량 파일 처리 후 다음 작업 동기적 또는 병렬 처리

 

 

🐍 [Python] 동기 vs 비동기 (웹 요청 예시)

✅ 동기적 웹 요청 (requests 라이브러리 사용)

import requests
import time

def fetch_data():
    print("🔵 요청 시작")
    response = requests.get("https://httpbin.org/delay/3")  # 3초 지연 응답
    print("🟢 응답 도착:", response.status_code)

def main():
    start = time.time()
    fetch_data()
    print("🎉 모든 작업 완료")
    print("⏱ 소요 시간:", time.time() - start)

main()

결과:

🔵 요청 시작
(3초 기다림)
🟢 응답 도착: 200
🎉 모든 작업 완료
⏱ 소요 시간: 3.0초

✅ 비동기적 웹 요청 (aiohttp + asyncio)

import aiohttp
import asyncio
import time

async def fetch_data():
    print("🔵 요청 시작")
    async with aiohttp.ClientSession() as session:
        async with session.get("https://httpbin.org/delay/3") as response:
            print("🟢 응답 도착:", response.status)

async def main():
    start = time.time()  # 시작 시간 기록
    task = asyncio.create_task(fetch_data())  # 비동기 작업을 "백그라운드"로 보냄
    print("🟡 다른 작업 수행 중...")  # 기다리지 않고 즉시 실행됨
    await task  # fetch_data()가 끝날 때까지 기다림
    print("🎉 모든 작업 완료")
    print("⏱ 소요 시간:", time.time() - start)

결과:

🔵 요청 시작
🟡 다른 작업 수행 중...
(3초 후)
🟢 응답 도착: 200
🎉 모든 작업 완료
⏱ 소요 시간: 3.0초

🌐 [JavaScript] 동기 vs 비동기 (웹 요청 예시)

브라우저 또는 Node.js 환경에서 작동

❌ 동기적 웹 요청 (자바스크립트에서는 거의 금지 수준)

// 동기적 XMLHttpRequest (비추천)
const request = new XMLHttpRequest();
request.open('GET', 'https://httpbin.org/delay/3', false);  // false → 동기
request.send(null);
console.log("응답 상태:", request.status);
console.log("🎉 모든 작업 완료");

결과: 브라우저가 멈춰버림 (동작 중엔 다른 건 아예 안 됨)


✅ 비동기적 웹 요청 (fetch + async/await)

async function fetchData() {
    console.log("🔵 요청 시작");
    const response = await fetch("https://httpbin.org/delay/3");
    console.log("🟢 응답 도착:", response.status);
}

async function main() {
    console.log("👉 첫 번째 작업");
    const task = fetchData(); // await 안 하면 먼저 실행됨
    console.log("👉 두 번째 작업");
    await task;
    console.log("🎉 모든 작업 완료");
}

main();

결과:

👉 첫 번째 작업
🔵 요청 시작
👉 두 번째 작업
(3초 후)
🟢 응답 도착: 200
🎉 모든 작업 완료

✅ 정리 요약

Python 예시 requests, time.sleep() asyncio, aiohttp
JS 예시 XMLHttpRequest(false) (구식) fetch(), async/await
특징 기다리는 동안 아무것도 못 함 기다리는 동안 다른 작업 가능
실전 사용 단순한 코드에 적합 사용자 응답성 & 효율성에 적합

'개발 공부' 카테고리의 다른 글

VSCODE 한글 입력 시 자동으로 2번 입력되는 문제 해결  (0) 2025.04.10
🎓 Oracle 18c XE 데이터베이스 실습 가이드 (설치부터 계정 생성까지)  (0) 2025.03.31
pip란? (Python Package Installer)  (0) 2025.03.19
자연어 처리 용어 정리 2  (0) 2025.03.14
CNN for LNP  (0) 2025.03.14
'개발 공부' 카테고리의 다른 글
  • VSCODE 한글 입력 시 자동으로 2번 입력되는 문제 해결
  • 🎓 Oracle 18c XE 데이터베이스 실습 가이드 (설치부터 계정 생성까지)
  • pip란? (Python Package Installer)
  • 자연어 처리 용어 정리 2
swk5276
swk5276
흔적을 기록하자
  • swk5276
    개발 공부 기록
    swk5276
  • 전체
    오늘
    어제
    • 분류 전체보기 (219)
      • Agent (5)
      • LangChain (7)
      • DAYCONE (2)
      • 백엔드 (3)
      • 인공지능 (13)
      • 개발 공부 (18)
      • MICROSOFT SAY (14)
      • IT 기술 (3)
      • 프레임워크 (2)
      • IT 개념 (15)
      • 알고리즘 (14)
      • 파이썬 (15)
      • 자바 (26)
      • 정보처리 (27)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DFS
    fetchAPI
    -
    객체
    API란?
    git 명령어
    시뮬레이션 알고리즘
    db
    python 예제
    데이터베이스
    Ajax
    flask 프레임워크
    인스턴스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
swk5276
동기적(synchronous) vs 비동기적(asynchronous)
상단으로

티스토리툴바