Post

동기와 비동기

Synchronous & Asynchronous

동기와 비동기

동기와 비동기란?

동기(Synchronous)비동기(Asynchronous)는 프로그램에서 작업을 처리하는 방식에 대한 개념이다. 이들은 주로 함수 호출, 작업 처리 방식, 입력/출력(I/O) 처리 등에 사용되며, 코드의 동작 흐름과 자원 관리에 큰 영향을 준다.


1. 동기(Synchronous)

동기란 작업이 순차적으로 처리되는 방식을 말한다. 이전 작업이 완료되기 전까지는 다음 작업이 시작되지 않는다.
즉, 작업의 종료를 기다리며 흐름을 유지하는 방식이다.

특징

  • 작업 순서를 예측할 수 있어 직관적이다.
  • 코드 작성과 디버깅이 쉽다.
  • 작업 대기 시간이 길면 효율이 떨어질 수 있다.

현업에서의 활용

동기 방식은 작업 순서가 중요하거나, 결과를 즉시 사용해야 하는 경우에 유용하다. 예를 들어, 데이터베이스 트랜잭션이나 계산 작업 등에서 동기 방식이 주로 사용된다.

예시 코드 (Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import time

def download_file():
    print("파일 다운로드 시작")
    time.sleep(3)  # 3초 대기
    print("파일 다운로드 완료")

def process_file():
    print("파일 처리 시작")
    time.sleep(2)  # 2초 대기
    print("파일 처리 완료")

def main():
    download_file()  # 파일 다운로드
    process_file()   # 다운로드된 파일 처리

main()

실행 결과

1
2
3
4
5
6
파일 다운로드 시작
(3초 대기)
파일 다운로드 완료
파일 처리 시작
(2초 대기)
파일 처리 완료

동기 방식에서는 각 작업이 완료된 후에야 다음 작업을 실행한다.


2. 비동기(Asynchronous)

비동기란 작업이 병렬적으로 처리될 수 있는 방식을 말한다. 작업을 요청한 뒤 결과를 기다리지 않고 다음 작업으로 넘어가는 방식이다.
비동기적으로 동작하는 코드는 응답 속도가 빠르고, 시스템 자원을 효율적으로 활용할 수 있다.

특징

  • 작업이 독립적으로 실행되며 병렬화 가능하다.
  • 결과를 기다리지 않아 효율적이다.
  • 코드가 복잡해질 수 있다(Promise, Callback, Async/Await 등 사용).

현업에서의 활용

비동기는 I/O 작업이 많거나 병렬 처리가 필요한 경우에 사용된다. 예를 들어:

  • 웹 서버에서 여러 사용자 요청 처리
  • API 호출
  • 파일 업로드/다운로드 등

예시 코드 (Python)

Python에서는 asyncio를 사용하여 비동기 처리를 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import asyncio

async def download_file():
    print("파일 다운로드 시작")
    await asyncio.sleep(3)  # 비동기 대기
    print("파일 다운로드 완료")

async def process_file():
    print("파일 처리 시작")
    await asyncio.sleep(2)  # 비동기 대기
    print("파일 처리 완료")

async def main():
    # 작업을 병렬적으로 실행
    await asyncio.gather(
        download_file(),
        process_file()
    )

asyncio.run(main())

실행 결과

1
2
3
4
5
6
파일 다운로드 시작
파일 처리 시작
(2초 후)
파일 처리 완료
(1초 추가 후)
파일 다운로드 완료

비동기 방식에서는 작업이 병렬적으로 실행되며, 대기 시간이 짧은 작업이 먼저 완료될 수 있다.


3. 동기와 비동기의 비교

특징동기(Synchronous)비동기(Asynchronous)
처리 방식작업이 순차적으로 처리됨작업이 병렬적으로 처리될 수 있음
작업 대기이전 작업 완료까지 대기대기하지 않고 다음 작업으로 진행
효율성작업 대기 시간으로 비효율적일 수 있음시스템 자원 활용도가 높음
코드 구조직관적이고 간단복잡한 구조 (콜백, async 필요)
적합한 경우계산 작업, 데이터 순차 처리네트워크, 파일 I/O, 병렬 작업

4. 동기와 비동기의 현업 적용 사례

동기 적용 사례

  1. 데이터베이스 트랜잭션
    • 작업 순서가 중요하여 동기적으로 처리해야 함.
    • 예) 은행 이체: A 계좌에서 돈을 인출한 뒤 B 계좌에 입금.
  2. 파일 처리
    • 특정 파일을 읽고 처리하는 경우.

비동기 적용 사례

  1. 웹 서버
    • 웹 서버는 수천 명의 사용자가 동시에 요청을 보내기 때문에 비동기로 처리하여 성능을 최적화.
  2. 네트워크 I/O
    • REST API 호출, 파일 다운로드/업로드.
  3. 대규모 데이터 처리
    • 데이터 파이프라인에서 여러 작업을 동시에 실행.

5. 비동기 방식의 추가 예제

다음은 파일 다운로드와 처리 작업을 순차적으로 진행하되, 각각의 작업이 독립적으로 실행되는 비동기 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import asyncio

async def download_file(file_name):
    print(f"{file_name} 다운로드 시작")
    await asyncio.sleep(3)  # 3초 대기
    print(f"{file_name} 다운로드 완료")

async def process_file(file_name):
    print(f"{file_name} 처리 시작")
    await asyncio.sleep(2)  # 2초 대기
    print(f"{file_name} 처리 완료")

async def main():
    files = ["파일1", "파일2", "파일3"]
    tasks = []

    # 각 파일에 대해 다운로드와 처리 작업을 비동기적으로 실행
    for file_name in files:
        tasks.append(download_file(file_name))
        tasks.append(process_file(file_name))

    # 모든 작업 병렬 실행
    await asyncio.gather(*tasks)

asyncio.run(main())

실행 결과

1
2
3
4
5
6
7
8
파일1 다운로드 시작
파일1 처리 시작
파일2 다운로드 시작
파일2 처리 시작
(작업 병렬 진행)
파일1 처리 완료
파일1 다운로드 완료
...

이와 같은 방식으로, 비동기 처리를 통해 대규모 작업을 병렬적으로 처리하여 효율을 극대화할 수 있다.


결론

  • 동기는 작업 순서가 중요하거나 단순한 작업 흐름이 필요한 경우 적합하다.
  • 비동기는 I/O 중심의 작업이나 병렬 처리가 필요한 경우 효율적이다.
  • 현업에서는 동기와 비동기를 적절히 조합하여 성능과 안정성을 동시에 확보한다.
This post is licensed under CC BY 4.0 by the author.