Python에서 async/await를 사용하면 비동기 코드를 동기 코드처럼 간단히 작성할 수 있습니다.
async/await는 Python 3.5 버전부터 지원하는 기능으로, asyncio 모듈을 기반으로 동작합니다.
기본 사용법은 다음과 같습니다:
import asyncio
async def main():
print('hello')
await asyncio.sleep(1)
print('world')
asyncio.run(main())
- async def로 비동기 함수를 정의합니다.
- await를 사용하여 비동기 함수 안에서 다른 비동기 함수를 호출할 수 있습니다.
- asyncio.run으로 비동기 함수를 실행합니다.
이렇게 하면 hello를 출력하고 1초 기다린 후 world가 출력되는 비동기 코드를 매우 간단히 작성할 수 있습니다.
await를 사용하면 비동기 함수가 끝날 때까지 대기하기 때문에 동기 코드처럼 보이지만, 실제로는 해당 함수가 완료될 때까지 다른 작업을 할 수 있습니다.
다음은 파일을 읽는 비동기 함수의 예제입니다:
import asyncio
import aiofiles
import time
async def read_file(file):
print(f'Reading {file}')
async with aiofiles.open(file, mode='r') as f:
text = await f.read()
print(f'{file} was {len(text)} bytes')
await asyncio.sleep(1)
return text
async def main():
await asyncio.gather(
read_file('file1.txt'),
read_file('file2.txt')
)
start = time.time()
asyncio.run(main())
end = time.time()
print(f'Took {end - start} seconds')
- asyncio.gather을 사용하여 여러 비동기 함수를 병렬로 실행할 수 있습니다.
- 각 파일을 읽는 동안 asyncio.sleep으로 1초 기다리는 시간이 겹쳐져 총 실행 시간이 1초밖에 안 걸립니다.
더 많은 예.
import asyncio
async def first_coroutine():
print("First Start")
await asyncio.sleep(2)
print("First End")
async def second_coroutine():
print("Second Start")
await asyncio.sleep(1)
print("Second End")
async def main():
await asyncio.gather(first_coroutine(), second_coroutine())
asyncio.run(main())
import asyncio
import aiohttp # 비동기 HTTP 요청을 위한 라이브러리
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, "http://example.com")
print(html)
asyncio.run(main())
이 예제에서는 first_coroutine과 second_coroutine 두 코루틴을 asyncio.gather()를 통해 동시에 실행합니다. first_coroutine이 2초, second_coroutine이 1초 대기하는데, 이들은 동시에 실행되므로 전체 실행 시간은 2초입니다.
결론
이처럼 async/await를 사용하면 병렬 처리가 간단해지는 장점이 있습니다. 동기 코드로 작성하기 어려운 복잡한 비동기 로직도 매우 간결하게 표현할 수 있습니다.
다만 async/await는 단순히 문법 상당의 기능으로, 그 자체로 병렬 처리를 보장하는 것은 아닙니다. 실제 병렬 실행을 위해서는 asyncio 모듈과 적절한 프로그래밍이 필요합니다.
'Python' 카테고리의 다른 글
Python의 메모리 관리 (0) | 2024.08.06 |
---|---|
Python 기본적인 File 다루기 (0) | 2024.01.26 |
[Python] Redis Docker 로 실행하고 Python 으로 사용하기 (0) | 2023.12.16 |
[Python] slack 으로 메시지 보내기 (webhook) (0) | 2023.12.16 |
[FireFox] Selenium "not reachable by keyboard" 오류 해결 (0) | 2023.11.30 |
댓글