본문 바로가기
Python 문법/Python 기본 문법(3.10 기준)

[python3.10 기본] 13. 비동기 프로그래밍

by cogito21_python 2024. 7. 2.
반응형

13.1 async와 await 키워드

비동기 함수는 async def 문으로 정의됩니다. 비동기 함수 내부에서 다른 비동기 함수의 실행을 기다리려면 await 키워드를 사용합니다.

 

비동기 함수 정의

import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

# 이벤트 루프 실행
asyncio.run(say_hello())

13.2 asyncio 모듈

asyncio 모듈은 비동기 I/O, 이벤트 루프, 태스크, 동기화를 지원하는 기능을 제공합니다.

 

비동기 함수 실행

import asyncio

async def main():
    print("Start")
    await asyncio.sleep(1)
    print("End")

asyncio.run(main())

여러 비동기 함수 실행

import asyncio

async def first():
    print("First start")
    await asyncio.sleep(2)
    print("First end")

async def second():
    print("Second start")
    await asyncio.sleep(1)
    print("Second end")

async def main():
    await asyncio.gather(first(), second())

asyncio.run(main())

태스크 생성

import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

async def main():
    task = asyncio.create_task(say_hello())
    await task

asyncio.run(main())

13.3 비동기 제너레이터와 컴프리헨션

비동기 제너레이터는 async 키워드를 사용하여 정의되며, yield 대신 yield 키워드와 함께 await 키워드를 사용할 수 있습니다.

 

비동기 제너레이터

import asyncio

async def async_generator():
    for i in range(3):
        await asyncio.sleep(1)
        yield i

async def main():
    async for value in async_generator():
        print(value)

asyncio.run(main())

비동기 컴프리헨션

import asyncio

async def async_generator():
    for i in range(3):
        await asyncio.sleep(1)
        yield i

async def main():
    result = [value async for value in async_generator()]
    print(result)

asyncio.run(main())

비동기 프로그래밍 예제

다음은 비동기 프로그래밍을 사용하여 여러 웹 페이지를 동시에 다운로드하는 예제입니다.

 

aiohttp 설치

pip install aiohttp

비동기 웹 페이지 다운로드

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = [
        "http://example.com",
        "http://example.org",
        "http://example.net"
    ]

    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)

        for result in results:
            print(result[:100])  # 첫 100글자만 출력

asyncio.run(main())
반응형