1. Concurrency(동시성) 과 Parallelism(병렬성)
병렬성 (Parallelism)
병렬성은 여러 작업을 동시에 수행하는 것을 의미합니다. 물리적으로 여러 CPU 코어나, 프로세서를 활용하여 각각의 작업을 동시에 처리할 수 있습니다.
동시성 (Concurrency)
병행성은 여러 작업을 동시에 하는 것처럼 보이게 만드는 기법입니다. 하나의 CPU가 여러 작업을 빠르게 번갈아 가며 처리함으로써 마치 동시에 실행되는 것처럼 동작합니다
2. Coroutine이란?
코루틴(Coroutine) 은 하나의 실행 흐름 안에서 여러 작업을 중단하고 다시 이어서 실행할 수 있는 특별한 함수입니다.
- 메인 흐름을 잠깐 멈추고 다른 작업을 처리할 수 있음
- 협력적 멀티태스킹(Cooperative multitasking)을 지원
즉, 코루틴은 함수가 한 번 끝나지 않고 중간에 멈췄다가 다시 이어서 실행될 수 있기 때문에 비동기 처리, 이벤트 처리, 대기 시간 처리에 적합합니다.
3. Coroutine의 주요 특징
- 일시 정지와 재개
- 코루틴은 yield나 await에서 멈추고 다시 이어서 실행됩니다.
- 동시성 처리
- 블로킹 없이 여러 작업을 순차적으로 실행해 CPU 점유 효율을 높입니다.
- 가벼운 리소스 사용
- 스레드/프로세스보다 메모리 부담이 작습니다.
- 양방향 통신 가능
- send() 등을 사용하여 외부에서 값을 보내고 내부에서 받아서 로직을 진행할 수 있습니다.
4. Python에서 Coroutine 사용방법
구분 | 설명 |
yield | 코루틴의 일시 정지 포인트 |
send(value) | 코루틴에 외부에서 데이터를 보내서 yield로 전달 |
close() | 코루틴 종료 |
throw() | 코루틴 내부에 예외 발생시키기 |
next() | 코루틴 시작 시 다음 yeild로 이동 |
5. 사용 예제
def simple_coro():
print("코루틴 시작")
x = yield
print(f"코루틴이 받은 값: {x}")
coro = simple_coro()
next(coro) # 코루틴 초기화 → 첫 yield까지 진행 : 코루틴 시작
coro.send("Hello") # 코루틴에 값 전달 → print 실행 : 코루틴이 받은 값: Hello
위의 예제는 간단한 coroutine 구현 내용입니다. next(coro)를 호출하여 코루틴을 초기화하고, 함수의 처음 yield 키워드가 있는 부분까지 실행합니다. send()함수를 통해 "Hello"라는 값을 전달하고 함수를 이어서 실행합니다. 위의 예제에서는 print()함수가 실행되는 것을 확인할 수 있습니다. 위의 예제에서 next(coro)룰 호출하여 코루틴을 초기화하지 않으면 send()에서 TypeError가 발생합니다.
def accumulator():
total = 0
while True:
value = yield total
if value is None:
break
total += value
coro = accumulator()
print(next(coro)) # 0 (초기 total)
print(coro.send(10)) # 10
print(coro.send(20)) # 30
coro.close() # 코루틴 종료
위의 예제는 누적 합을 리턴하는 함수입니다. yield 지점에서 total을 반환하고 값을 입력받습니다.
None을 입력받거나, close() 함수를 통해 루프를 종료할 수 있습니다.
6. async와 await
전통적인 코루틴(yield 기반)은 파이썬 3.5부터 async / await 문법으로 대체되고 있습니다.
import asyncio
async def hello():
print("Hello")
await asyncio.sleep(1)
print("World")
asyncio.run(hello())
- async def로 정의된 함수는 코루틴 객체를 반환합니다.
- await는 다른 코루틴이나 비동기 함수의 실행을 잠시 멈췄다가 결과를 기다립니다.
- asyncio 모듈과 함께 사용하면 고성능 비동기 I/O 코드를 작성할 수 있습니다.
'Programming > Python' 카테고리의 다른 글
[Python] Async I/O 정리 (13) | 2025.06.21 |
---|---|
[Python] Future 이해하기 (2) | 2025.06.20 |
[Python] 클로저 (Closure) (0) | 2025.06.17 |
[Python] 일급함수(First-class Function) (3) | 2025.06.17 |
[Python] Generator에 대한 이해 (0) | 2025.06.16 |