Python의 asyncio 라이브러리는 어떻게 사용하나요?
_____A1: asyncio는 Python 3.4 이상에서 사용할 수 있는 비동기 I/O를 지원하는 표준 라이브러리로, 코드를 동시적(concurrent)으로 실행할 수 있게 도와줍니다. 주로 네트워크 통신, 웹 요청, 파일 입출력 등에서 효율적인 비동기 처리를 구현할 때 사용됩니다.
Q2: asyncio를 사용하려면 어떻게 시작해야 하나요?
A2: 먼저 asyncio 모듈을 import합니다. 그리고 `async def`로 비동기 함수를 정의하며, `await` 키워드를 통해 다른 비동기 함수의 완료를 기다립니다. 이벤트 루프(event loop)를 실행하여 비동기 코드를 동작시키는데, Python 3.7 이상에서는 `asyncio.run()` 함수를 추천합니다.
예시:
```python
import asyncio
async def hello():
await asyncio.sleep(1)
print("Hello asyncio")
asyncio.run(hello())
```
Q3: `async`와 `await`는 무엇인가요?
A3: `async`는 비동기 함수를 정의하는 키워드이고, `await`는 비동기 함수 내에서 다른 비동기 작업의 완료를 기다릴 때 사용합니다. `await`는 실행 중인 코루틴을 일시 중지했다가, 작업이 완료되면 다시 재개합니다.
Q4: 이벤트 루프(event loop)란 무엇인가요?
A4: 이벤트 루프는 asyncio의 핵심으로, 비동기 작업을 스케줄링하고 실행하는 역할을 합니다. 이벤트 루프는 대기 중인 작업을 관리하며 완료시 콜백을 호출하는 방식으로 효율적으로 여러 작업을 처리합니다.
Q5: 여러 비동기 작업을 동시에 실행하려면 어떻게 하나요?
A5: `asyncio.gather()`를 이용해 여러 코루틴을 동시에 실행하고 모두 완료될 때까지 기다릴 수 있습니다.
예시:
```python
async def task1():
await asyncio.sleep(1)
return 'task1 done'
async def task2():
await asyncio.sleep(2)
return 'task2 done'
results = await asyncio.gather(task1(), task2())
print(results) ['task1 done', 'task2 done']
```
Q6: asyncio에서 타임아웃을 추가하는 방법은?
A6: `asyncio.wait_for()`를 사용하면 특정 비동기 작업에 타임아웃을 걸 수 있습니다.
예시:
```python
try:
await asyncio.wait_for(some_coroutine(), timeout=3.0)
except asyncio.TimeoutError:
print("Timeout occurred")
```
Q7: 동기 함수 내부에서 asyncio 코드를 실행하려면?
A7: Python 3.7 이상에서는 `asyncio.run()`을 사용하고, 이미 이벤트 루프가 실행 중이라면 `asyncio.create_task()`나 `await`으로 처리해야 합니다. 동기 코드에서 직접 `asyncio.run()`을 여러 번 호출하는 것은 권장되지 않습니다.
Q8: 비동기 제너레이터와 컨텍스트 매니저는 어떻게 사용하나요?
예시:
```python
class AsyncIterator:
async def __aiter__(self):
return self
async def __anext__(self):
비동기 반복 로직 작성
pass
async with some_async_context_manager():
비동기 컨텍스트 처리
```
Q9: asyncio의 주요 함수 및 클래스는 무엇이 있나요?
A9:
- `asyncio.run()`: 비동기 함수 실행
- `asyncio.create_task()`: 코루틴을 백그라운드 작업으로 스케줄링
- `asyncio.gather()`: 여러 코루틴 동시 실행
- `asyncio.sleep()`: 비동기 대기
- `asyncio.Queue`: 비동기 큐
- `asyncio.Lock`, `asyncio.Event`: 동기화 도구
Q10: asyncio와 multithreading은 어떻게 다르나요?
A10: asyncio는 단일 스레드 내에서 이벤트 루프를 통해 비동기 작업을 처리하며, 스레드 생성 비용 없이 효율적으로 I/O 바운드 작업을 처리합니다. 반면 threading은 여러 스레드를 생성하여 병렬 처리를 하지만 컨텍스트 스위칭 비용이 높고, GIL(Global Interpreter Lock)에 의해 CPU 바운드 작업 처리에 제한이 있습니다.
Q11: asyncio를 이용한 네트워크 프로그래밍 기본 예제는?
A11:
```python
import asyncio
async def handle_echo(reader, writer):
data = await reader.read(100)
message = data.decode()
writer.write(data)
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle_echo, '127.0.0.1', 8888)
async with server:
await server.serve_forever()
asyncio.run(main())
```
Q12: asyncio에서 예외 처리는 어떻게 해야 하나요?
A12: 비동기 함수 내부에서 일반 try-except를 사용하면 됩니다. 단, `asyncio.gather()` 사용 시 `return_exceptions=True` 옵션을 통해 각 작업의 예외를 별도로 받을 수도 있습니다.
---
이상으로 Python asyncio 사용법에 관한 주요 FAQ 답변이었습니다. 필요에 따라 공식 문서(https://docs.python.org/3/library/asyncio.html)에서 심화 내용을 참조하세요.
작성자:
정주영 [비회원]
| 작성일자: 1년 전
2024-09-12 16:03:43
조회수: 143 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 143 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.