🎯 핵심 요약
| 동기적(Synchronous) | 비동기적(Asynchronous) | |
| 처리 방식 | 하나 끝나야 다음 작업 | 기다리지 않고 바로 다음 작업 |
| 예시 | 줄 서서 계산하기 | 음식 시키고 다른 일 하기 |
| 특징 | 순차적, 단순 | 병렬적, 효율적 |
🛍️ 실생활 예시로 이해해보자
✅ 동기적 예시 – 마트 계산대 줄 서기
- 앞사람이 계산할 때까지 넌 기다려야 해
- 앞사람이 끝나야 네 계산이 시작돼
- 네 계산이 끝나야 다음 사람이 계산 가능
👉 이게 동기적 처리야.
하나 끝나야 다음 작업이 시작돼. 단순하지만 시간이 오래 걸릴 수 있어.
✅ 비동기적 예시 – 배달 음식 시키기
- 네가 치킨을 시켜 (이건 시간이 오래 걸려)
- 치킨이 오기 전까지 넌 TV도 보고 숙제도 해
- 치킨이 오면 띵동~ 하고 알려줘, 그때 먹으면 돼
👉 이게 비동기적 처리야.
치킨(느린 작업)을 기다리는 동안 다른 일도 같이 할 수 있어.
✅ 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 |