동기(Synchronous)
차례차례 작업을 실행하는 것이다. 예를 들어 아래의 1번 작업이 끝나야 이어서 2번 작업을 실행하는 것이다.
작업을 맞춰 실행한다는 말은 요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 것을 말한다.
즉, 동기 프로그래밍이란 여러 작업들을 순차적으로 실행하도록 개발하는 것이다.
특징
- 작업이 순차적으로 실행되며, 다음 작업은 이전 작업이 끝난 후에 실행된다.
- 대기 시간이 발생할 수 있으며, I/O 작업(파일 읽기/쓰기, 네트워크 요청 등) 중에 CPU가 유휴 상태로 대기한다.
코드 예시
import time
def task1():
print("Task 1 시작")
time.sleep(2) # 2초 대기 (동기 작업)
print("Task 1 완료")
def task2():
print("Task 2 시작")
time.sleep(1) # 1초 대기 (동기 작업)
print("Task 2 완료")
task1()
task2()
실행 결과
Task 1 시작
(2초 대기)
Task 1 완료
Task 2 시작
(1초 대기)
Task 2 완료
- 작업 1이 완료될 때까지 작업 2는 대기한다.
비동기(Asynchronous)
순차적으로 실행할 필요가 없다. 아래의 그림에서 1,2,3,4 번을 동시에 실행할 수 있다.
동기와 반대로 요청한 작업에 대해 완료 여부를 따지지 않기 때문에 자신의 다음 작업을 그대로 수행하게 된다.
이런식으로, 비동기 프로그래밍이란 여러 작업들을 독립적으로 실행하도록 개발하는 것이다.
특징
- 작업이 병렬적으로 처리될 수 있으며, 각 작업의 완료 시점을 운영체제가 관리한다.
- 프로세스나 쓰레드가 대기하지 않고 다른 작업을 수행할 수 있다.
- 코드 흐름이 복잡할 수 있지만, 시스템 자원 활용이 효율적이다.
코드 예시
import asyncio
async def task1():
print("Task 1 시작")
await asyncio.sleep(2) # 2초 대기 (비동기 작업)
print("Task 1 완료")
async def task2():
print("Task 2 시작")
await asyncio.sleep(1) # 1초 대기 (비동기 작업)
print("Task 2 완료")
async def main():
await asyncio.gather(task1(), task2()) # 두 작업을 동시에 실행
asyncio.run(main())
실행 결과
Task 1 시작
Task 2 시작
(1초 대기)
Task 2 완료
(1초 추가 대기)
Task 1 완료
- Task 1과 Task 2가 동시에 시작되며, 대기 시간 동안 다른 작업을 진행한다.
이렇게 동기 작업은 요청한 작업에 대해 순서가 지켜지는 것을 말하는 것이고, 비동기 작업은 순서가 지켜지지 않을 수 있다는 것을 말한다.
'CS' 카테고리의 다른 글
[CS] 멀티 코어 vs 멀티 프로세스 vs 멀티 스레드 (0) | 2024.12.17 |
---|---|
[CS] 스레드의 종류 (0) | 2024.12.10 |
[CS] 인터럽트와 시스템 콜 (1) | 2024.12.03 |
[CS] CPU bound, IO bound (1) | 2024.12.03 |
[CS] 동기화 기법 (1) | 2024.11.28 |