[IT] 동기와 비동기
동기(Synchronous) vs 비동기(Asynchronous)
동기와 비동기는 작업을 처리하는 방식을 나타내는 개념
특히 네트워크 통신, 운영체제의 입출력(I/O) 처리, 멀티스레딩, 프로그래밍에서 중요
1. 동기(Synchronous) 처리
하나의 작업이 끝나야 다음 작업을 실행하는 방식
태스크(작업)를 순차적으로 실행
한 작업이 완료될 때까지 다음 작업은 대기
✅ 특징
- 순차적으로 실행됨
- 응답을 받을 때까지 대기해야 함 (Blocking)
- 코드가 직관적이고 이해하기 쉬움
- 한 작업이 오래 걸리면 전체 프로그램이 지연될 수 있음
✅ 예제
- 전화 통화: 상대방이 대답할 때까지 기다려야 대화가 진행됨
- scanf() 같은 표준 입력 함수: 사용자가 입력할 때까지 프로그램이 멈춤
- HTTP 요청(기본 요청 방식): 요청을 보내고 응답이 올 때까지 기다려야 다음 코드가 실행됨
✅ Ex
import time
def sync_function():
print("작업 1 시작")
time.sleep(2) # 2초 대기 (Blocking)
print("작업 1 완료")
print("작업 2 시작")
time.sleep(2)
print("작업 2 완료")
sync_function()
📌 실행 흐름:
- 작업 1이 끝나야 작업 2가 실행됨.
- time.sleep(2) 동안 프로그램이 멈춤.
2. 비동기(Asynchronous) 처리
작업이 끝날 때까지 기다리지 않고, 동시에 여러 작업을 처리하는 방식
여러 태스크를 동시에 처리
한 작업이 시작되면 그 작업이 끝나기를 기다리지 않고 다음 작업을 시작할 수 있다.
✅ 특징
- 요청을 보내고 바로 다음 작업을 수행할 수 있음 (Non-blocking)
- 여러 작업을 동시에 처리 가능
- 사긴이 오래 걸리는 작업을 효율적으로 처리
- 실행 순서가 보장되지 않을 수 있음
- 효율적이지만 코드가 복잡해질 수 있음
✅ 예제
- 문자 메시지: 메시지를 보내고 상대방의 답장을 기다리지 않고 다른 일을 할 수 있음
- AJAX 요청: 웹페이지에서 데이터를 요청할 때 화면이 멈추지 않음
- Node.js의 fs.readFile(): 파일을 읽는 동안 다른 작업을 수행할 수 있음
✅ Ex (Python, asyncio 사용)
import asyncio
async def async_function():
print("작업 1 시작")
await asyncio.sleep(2) # 비동기 대기 (Non-blocking)
print("작업 1 완료")
print("작업 2 시작")
await asyncio.sleep(2)
print("작업 2 완료")
asyncio.run(async_function())
📌 실행 흐름:
- await asyncio.sleep(2)는 프로그램을 멈추지 않고 다른 작업을 할 수 있도록 함.
- 여러 개의 비동기 작업을 동시에 실행할 수 있음.
3. 동기 vs 비동기 비교
동기 (Synchronous) / 비동기 (Asynchronous)
실행 방식 | 순차 실행 | 동시에 여러 작업 처리 가능 |
대기 시간 | 응답이 올 때까지 대기 (Blocking) | 응답을 기다리지 않음 (Non-blocking) |
속도 | 느림 | 빠름 (병렬 처리 가능) |
코드 가독성 | 쉬움 | 상대적으로 복잡 |
예제 | 전화 통화, 동기 HTTP 요청 | 문자 메시지, AJAX, 비동기 HTTP 요청 |
4. 언제 동기 / 비동기를 사용할까?
🔹 동기 방식이 좋은 경우
- 단순한 프로그램 (작업이 많지 않거나, 순서가 중요한 경우)
- 데이터 일관성이 중요한 경우 (트랜잭션 처리 등)
- 요청과 응답의 흐름이 명확해야 하는 경우
🔹 비동기 방식이 좋은 경우
- 네트워크 요청, 파일 I/O 등 시간이 오래 걸리는 작업
- UI/UX가 중요한 애플리케이션 (사용자가 기다리지 않도록)
- 서버가 많은 요청을 처리해야 하는 경우 (예: 웹 서버)
5. 비동기 프로그래밍의 주요 패턴
1. 콜백(Callbacks)
- 비동기 작업이 완료되면 호출될 함수를 전달
- 장점: 간단한 구현
- 단점: 콜백 지옥(Callback Hell)에 빠질 수 있음
2. 프로미스(Promises) / 퓨처(Futures)
- 비동기 작업의 최종 완료 또는 실패를 나타내는 객체
- 장점: 체이닝을 통한 가독성 향상
- 단점: 오류 처리가 복잡할 수 있음
3. async/await
- 비동기 코드를 동기 코드처럼 작성할 수 있게 해주는 문법적 설탕
- 장점: 가독성이 매우 좋고 직관적
- 단점: 모든 언어에서 지원하지 않음
6. 비동기 + 멀티스레드 / 멀티프로세스
비동기는 단일 스레드에서도 실행되지만, 멀티스레드/멀티프로세스를 결합하면 성능을 더욱 향상시킬 수 있다.
✅ 멀티스레딩 (Multi-threading):
- 여러 개의 스레드를 생성해서 동작
- 같은 메모리를 공유하기 때문에 데이터 충돌에 주의
✅ 멀티프로세싱 (Multi-processing):
- 여러 개의 프로세스를 생성해서 동작
- 메모리를 분리해서 사용하므로 안전하지만 오버헤드가 있음
7. 비동기 활용 예제 (멀티태스킹)
비동기 + 멀티스레딩으로 동작하는 예제
import threading
import time
def task(name, duration):
print(f"{name} 시작")
time.sleep(duration) # 동기적 대기 (Blocking)
print(f"{name} 완료")
# 여러 개의 스레드 실행
thread1 = threading.Thread(target=task, args=("작업 1", 3))
thread2 = threading.Thread(target=task, args=("작업 2", 2))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("모든 작업 완료!")
✅ 동작 방식:
- 작업 1과 작업 2가 동시에 실행됨 → 전체 실행 시간이 단축됨
- join()을 호출해야 메인 스레드가 스레드들이 끝날 때까지 기다림
7. 결론
- 동기: 순차 실행, 이해하기 쉽지만 느림
- 비동기: 병렬 처리 가능, 속도 빠르지만 코드가 복잡해질 수 있음
- 멀티스레딩/멀티프로세싱을 활용하면 성능을 더욱 높일 수 있음
reference
https://miki3079.tistory.com/141
동기와 비동기의 차이: 초보자를 위한 완벽 가이드
동기와 비동기의 차이: 초보자를 위한 완벽 가이드안녕하세요, 프로그래밍 열정가 여러분! 오늘은 프로그래밍에서 매우 중요한 개념인 '동기(Synchronous)'와 '비동기(Asynchronous)'에 대해 자세히 알
miki3079.tistory.com
https://80000coding.oopy.io/ed22f6e8-89ea-4164-a86e-a6b92a1f54b4
동기와 비동기? 무슨 차이일까?
Node.js를 공부하다가 동기와 비동기에대한 개념을 한번 정리해보았다. Node.js는 비동기방식의 대표적인 플랫폼으로 비동기에 대한 특성과 예제를 적어보고 싶었다.
80000coding.oopy.io