비동기 프로그래밍은 특정 작업을 수행하는 동안 다른 작업을 동시에 처리할 수 있는 방식입니다. Python에서 asyncio 모듈은 비동기 프로그래밍을 지원하여, 비동기 함수들을 작성하고 실행할 수 있게 합니다. 이 방식의 주요 목적은 효율적인 I/O 작업 처리입니다.
async와 await 구문 설명async 키워드:이 키워드는 함수 정의 앞에 붙여서 해당 함수가 비동기로 작동할 것임을 명시합니다. async로 정의된 함수는 코루틴이 됩니다.
코루틴은 일종의 함수지만, 일반적인 함수와 달리 실행이 중단될 수 있고, 중단된 지점부터 다시 실행할 수 있습니다.
python코드 복사
async def my_coroutine():
# 비동기 작업을 수행하는 코드
pass
await 키워드:await는 비동기 함수(또는 코루틴)를 호출할 때 사용합니다. 이 키워드는 비동기 작업이 완료될 때까지 현재 함수의 실행을 일시적으로 중단하고, 비동기 작업이 완료되면 실행을 재개합니다.
await는 비동기 함수 내에서만 사용할 수 있습니다.
python코드 복사
async def my_coroutine():
result = await some_async_function() # 비동기 함수의 완료를 기다림
print(result)
python코드 복사
import asyncio
async def fetch_data():
print("Start fetching data...")
await asyncio.sleep(2) # 2초간 대기 (I/O 작업을 시뮬레이션)
print("Data fetched!")
return {"data": "sample"}
async def main():
print("Before fetching data")
data = await fetch_data()
print("After fetching data:", data)
asyncio.run(main())
fetch_data 함수:async로 정의된 비동기 함수입니다. 이 함수는 2초간 대기(await asyncio.sleep(2))한 후 데이터를 반환합니다.await asyncio.sleep(2)는 2초간 대기하는 동안 다른 작업이 실행될 수 있도록 CPU 제어를 양보합니다.main 함수:main 함수에서도 비동기 함수인 fetch_data를 호출하기 위해 await를 사용합니다.asyncio.run(main())는 이벤트 루프를 실행하고, main 함수가 종료될 때까지 대기합니다.비동기 프로그래밍은 특히 I/O 중심 작업에서 효율성을 극대화할 수 있습니다. asyncio 모듈과 async, await 키워드를 사용하면 Python에서 이러한 비동기 작업을 쉽게 구현할 수 있습니다. 하지만, 비동기 코드는 복잡성이 증가할 수 있으므로 필요에 따라 신중하게 사용하는 것이 중요합니다.
비동기 프로그래밍에서는 작업이 실행되기를 기다리기보다는, 작업이 완료될 때까지 다른 작업을 계속 실행할 수 있습니다. 이렇게 하면 프로그램의 효율성이 크게 향상됩니다.
async def로 정의된 함수는 비동기 함수입니다.await 키워드로 다른 비동기 작업을 기다립니다.python코드 복사
async def my_async_function():
await some_other_async_function()
python코드 복사
async def process_data():
data = await fetch_data()
handle_data(data)
def handle_data(data):
# 데이터를 처리하는 코드
위 코드에서 handle_data 함수는 process_data 비동기 함수 내에서 비동기 작업이 완료된 후 호출되는 핸들러의 역할을 합니다.
비동기 프로그래밍에서 핸들러는 다음과 같은 상황에서 주로 사용됩니다:
python코드 복사
import asyncio
async def download_file(url):
print(f"Downloading from {url}")
await asyncio.sleep(2) # 파일 다운로드 시뮬레이션
return "file_content"
async def save_file(content):
print("Saving file...")
await asyncio.sleep(1) # 파일 저장 시뮬레이션
print(f"File saved with content: {content}")
async def main():
file_content = await download_file("http://example.com")
await save_file(file_content)
asyncio.run(main())
이 예제에서 download_file과 save_file은 비동기 함수이며, main 함수는 비동기 작업이 완료될 때 이를 처리하는 핸들러 역할을 합니다. 이 방식으로 비동기 작업의 결과를 처리할 수 있습니다.
핸들러는 주로 비동기 작업의 결과를 처리하거나, 에러가 발생했을 때 이를 처리하기 위해 사용되며, 비동기 프로그래밍의 핵심 구성 요소입니다.