일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 | 29 | 30 |
31 |
- HashTable
- easy
- 미디움
- string
- dfs
- backtracking
- Array
- list
- binary search
- DP
- tree
- Binary
- 중간
- Python
- linked list
- hash table
- matrix
- two pointers
- 이진트리
- Medium
- leetcode
- 리트코드
- 문자열
- 재귀
- sorting
- binary tree
- math
- recursive
- Depth-first Search
- 쉬움
- Today
- Total
부부의 코딩 성장 일기
Python coroutine 코루틴, asyncio 라이브러리 본문
코루틴이란?
파이썬은 기본적으로 동기적인 프로그래밍 스타일을 채택하고 있다.
그래서, 기본적인 함수 호출 및 코드 실행은 순차적으로 진행이 되며, 한 작업이 끝나야 다음 작업이 수행된다. 이를 동기 프로그래밍이라고 한다. 반대로 비동기의 경우, 여러 작업을 동시에 수행할 수 있게 하는 프로그래밍 스타일이다.
이는 특히 I/O 작업이나, 네트워크 통신과 같은 지연이 발생하는 작업들을 효율적으로 다루는데 유용하다.
파이썬에서 코루틴은, 비동기 프로그래밍을 지원하는 기능 중 하나라고 보면 된다.
함수의 실행을 일시 중단하고, 나중에 재개할 수 있는 함수이며, 이를 통해 여러 작업ㅇ르 동시에 수행하는 데 유용하고, 비동기 코드를 쉽게 작성할 수 있다.
코루틴을 정의하는 방법은 함수 정의와 유사하지만, 함수를 호출하면 실행되지 않고, 코루틴 객체가 반환이 되며,
코루틴을 실행하기 위해서는 next()함수나 send() 메서드를 사용한다.
코루틴은 'yield' 키워드를 사용하여 값을 반환하고 일시 중단할 수 있다.
아래 예제를 보면, simple_coroutine은 코루틴 함수이고, 여기서 yield를 만나게 되면, 코루틴이 일시 중단이 되고,
값을 받기 위해 대기하게 되며, 여기서 coroutine.send(10)을 호출하면, 코루틴이 재개되고, 전달된 값인 10이 x에 할당되어 출력이 된다.
def simple_coroutine():
print("Coroutine has started")
x = yield # 코루틴이 여기에서 일시 중단됨
print("Coroutine received:", x)
# 코루틴 객체 생성
coroutine = simple_coroutine()
# 코루틴 시작
next(coroutine)
# 코루틴으로 값 보내기
coroutine.send(10)
asyncio
보통 파이썬에서 코루틴을 구현할 때에는 asyncio 라이브러리를 함께 사용한다.
아래의 예제를 보면, foo와 bar는 async def로 선언된 비동기 함수로, await asyncio.sleep()을 통해 비동기적으로 대기하고 있다.
main 함수에서 asyncio.gather를 이용하여, foo와 bar를 동시에 실행하고,
이를 이벤트 루프를 통해 비동기적으로 실행하게 된다.
asyncio.sleep은 일시 중단되겠지만, 다른 비동기 작업이 이루어질 동안, 이벤트 루프는 블록되지 않고, 다른 작업을 처리할 수 있으며,
이렇게 함으로써 작업을 효율적으로 다룰 수 있게 된다.
import asyncio
async def foo():
print("Start foo")
await asyncio.sleep(2) # 비동기적으로 대기
print("End foo")
async def bar():
print("Start bar")
await asyncio.sleep(1)
print("End bar")
async def main():
# foo와 bar를 비동기적으로 실행
await asyncio.gather(foo(), bar())
# asyncio 이벤트 루프 생성
loop = asyncio.get_event_loop()
# main 함수 비동기적으로 실행
loop.run_until_complete(main())
# 이벤트 루프 종료
loop.close()
'Python > Fundamentals' 카테고리의 다른 글
Python 추상화와 abc 라이브러리 (0) | 2024.02.29 |
---|---|
Python에서 __init__.py 의 역할 (0) | 2024.02.24 |
데코레이터(Decorator) (0) | 2024.02.19 |
얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) (0) | 2024.02.18 |