[Python] 동시성 프로그래밍 (2) 코루틴(Coroutine)
동시성 (Concurrency) 과 병렬성 (Parallelism)
동시성(Concurrency)이란, 여러 작업이 겹쳐서 실행될 수 있는 방식을 의미한다.
이를테면, 여러 작업이 동시에 실행되는 것처럼 보이지만, 실제로는 CPU가 짧은 시간 단위로 여러 작업을 번갈아가면서 처리하는 방식이다.
병렬성(Parallelism)이란, 여러 작업을 실제로 동시에 처리하는 것을 의미한다. 즉, 여러 CPU코어가 각각 별도의 작업을 동시에 수행하는 방식이다. 병렬성은 실제로 물리적인 여러 프로세서나 CPU 코어가 필요하다.
즉, 동시성은 "논리적"에 가깝고 병렬성은 "물리적"에 가깝다.
코루틴(Coroutine)
코루틴은 파이썬을 비롯한 여러 프로그래밍 언어에서 비동기처리나 동시성(Concurrency)을 구현하는데 활용된다.
코루틴(Coroutine)은 비동기 프로그래밍을 위해 설계된 함수의 일종으로, 일반 함수와는 달리 실행을 일시 중단(suspend)하고 나중에 다시 재개(resume)할 수 있는 기능을 가지고 있다. 이로 인해 효율적으로 여러 작업을 동시에 수행하는 것처럼 보이게할 수 있다.
💡 루틴 (routine)
루틴은 일반적으로 특정 작업을 수행하는 코드 단위를 의미한다.
컴퓨터 과학에서는 함수, 서브루틴, 프로시저 등을 "루틴"이라고 부르기도 하는데, 이는 어떤 작업을 수행하는 독립적인 코드 블록이라는 뜻이다.
🤔 코루틴에서 Co- 가 붙는 이유
일반 함수(루틴)는 호출되면 시작부터 끝까지 순차적으로 실행되고 종료되는 반면에, 코루틴은 루틴의 일종이지만 실행 도중에 멈추고 다른 코드를 실행 후 나중에 다시 실행할 수 있다.
코(co-)는 협력(cooperation)을 의미하며, 코루틴은 다른 루틴이나 코루틴과 협력하여 실행 흐름을 공유한다는 특징이 있다.
코루틴(Coroutine)과 동시성(Concurrency)
코루틴은 여러 작업을 동시에 수행하는 것처럼 보이게 하기 때문에 동시성(concurrency)을 구현할 수 있다.
예를 들어, 여러 네트워크 요청을 처리할 때 각 요청을 대기하는 동안 다른 요청을 수행할 수 있어 효율적이다.
다만, 코루틴은 자체가 병렬로 실행되는 것은 아니므로 병렬성(Parallelism)과는 다르다.
코루틴의 주요 특징
실행 중단 및 재개 가능: 코루틴은 await, yield와 같은 키워드를 사용하여 중간에 멈추고 제어를 호출자에게 돌려줄 수 있다. 이후 호출자가 다시 코루틴을 재개하면 멈췄던 위치부터 실행이 이어진다.비동기 프로그래밍에 최적화: 코루틴은 시간이 오래걸리는 작업(파일 입출력, 네트워크 요청)을 비동기적으로 처리할 수 있게 해주며, 이를 통해 프로그램이 멈추지 않고 다른 작업을 수행할 수 있다.메모리 효율성: 코루틴은 스레드를 새로 생성하지 않고도 작업을 중단 및 재개할 수 있기 때문에 메모리를 절약하고 오버헤드를 줄이는 동시에 동시성을 구현할 수 있다.
코루틴 사용 방법
파이썬에서는 async와 await 키워드를 사용하여 코루틴을 정의하고 호출할 수 있다.
import asyncio
# 코루틴 함수 정의
async def my_coroutine1():
print("task 1 Start")
await asyncio.sleep(1)
print("task 1 End")
async def my_coroutine2():
print("task 2 Start")
await asyncio.sleep(1)
print("task 2 End")
async def my_coroutine1():
print("task 2 Start")
await asyncio.sleep(1)
print("task 2 End")
# 여러 코루틴을 동시에 실행하는 메인 함수 정의
async def main():
await asyncio.gather(my_coroutine1(), my_coroutine2(), my_coroutine3())
# 이벤트 루프에서 main 함수 실행
asyncio.run(main())
my_coroutine1, 2, 3은 각각 독립된 코루틴 함수다.
각 코루틴은 "start" 메시지를 출력하고 1초 동안 중단된 후 1초가 지나면 완료 메시지를 출력한다.
main 함수에서 gather()를 사용하여 1, 2, 3를 동시에 실행한다. (gather는 전달된 모든 코루틴을 동시에 실행하도록 예약한다.) 그 후 run() 함수를 통해 이벤트 루프가 시작되고 메인 함수가 실행된다.
실제로 위 코드를 실행하면 다음과 같은 순서로 출력 된다.
Task 1 시작
Task 2 시작
Task 3 시작
-----------
Task 1 완료
Task 2 완료
Task 3 완료
'👩💻 Develope > Python' 카테고리의 다른 글
[Python] Asyncio (0) | 2024.11.13 |
---|---|
[Python] 동시성 프로그래밍 (1) 프로세스, 스레드 (0) | 2024.11.05 |
[Python] pip freeze 명령어 사용 시 패키지 버전이 제대로 나오지 않을 때 (0) | 2024.10.14 |
[Python][bs4] BeautifulSoup4에서 텍스트로 파싱하기 (0) | 2024.10.08 |
[Python] glob (1) | 2024.09.26 |