IT

[IT] 동기와 비동기

위시리 2025. 2. 11. 13:16
 동기(Synchronous) vs 비동기(Asynchronous)

동기와 비동기는 작업을 처리하는 방식을 나타내는 개념
특히 네트워크 통신, 운영체제의 입출력(I/O) 처리, 멀티스레딩, 프로그래밍에서 중요

 

1.  동기(Synchronous) 처리

하나의 작업이 끝나야 다음 작업을 실행하는 방식
태스크(작업)를 순차적으로 실행
한 작업이 완료될 때까지 다음 작업은 대기

https://velog.velcdn.com/images/khy226/post/a37f9642-9d61-4614-b57e-1052b401774d/image.png


특징

  • 순차적으로 실행됨
  • 응답을 받을 때까지 대기해야 함 (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) 처리

작업이 끝날 때까지 기다리지 않고, 동시에 여러 작업을 처리하는 방식
여러 태스크를 동시에 처리
한 작업이 시작되면 그 작업이 끝나기를 기다리지 않고 다음 작업을 시작할 수 있다.

https://velog.velcdn.com/images/khy226/post/9c7c7c63-30c9-4360-b64b-138fbf276e50/image.png


특징

  • 요청을 보내고 바로 다음 작업을 수행할 수 있음 (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