[파이썬] aiohttp 비동기 스케쥴링 처리하기

비동기 웹 프레임워크인 aiohttp를 사용하면 웹 애플리케이션을 개발할 때 더욱 효율적으로 작업을 처리할 수 있습니다. 그 중에서도 스케쥴링은 애플리케이션에서 반복적으로 발생하는 작업을 일정 간격으로 실행하는 기능입니다. 이번 글에서는 aiohttp의 asyncio 기반으로 스케쥴링 처리하는 방법을 알아보겠습니다.

asyncio 스케쥴러 사용하기

asyncio 패키지에는 스케쥴링을 위한 asyncio.create_task() 함수와 asyncio.sleep() 함수가 있습니다. create_task() 함수는 비동기 작업을 스케쥴러에 등록하고 실행하는 역할을 합니다. sleep() 함수는 주어진 시간 동안 대기하는 역할을 합니다.

다음은 aiohttp를 사용하여 스케쥴링 작업을 처리하는 간단한 예제입니다. 각 요청이 일정 간격으로 호출되는 기능을 구현해보았습니다.

import asyncio
from aiohttp import ClientSession

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

async def make_requests():
    urls = ['https://example.com', 'https://google.com', 'https://twitter.com']
    
    async with ClientSession() as session:
        while True:
            for url in urls:
                response = await fetch(session, url)
                print(response)
            await asyncio.sleep(5)  # 5초 대기 후 다음 작업 실행

loop = asyncio.get_event_loop()
loop.run_until_complete(make_requests())

위 코드에서 make_requests() 함수는 비동기적으로 각 URL에 접속하고 응답을 출력합니다. asyncio.sleep() 함수를 사용하여 5초 동안 대기하고 다음 작업을 실행합니다.

aiohttp의 스케쥴링 기능과의 차이점

위의 예제에서는 asyncio 패키지의 기능을 사용하여 스케쥴링을 처리했습니다. 그러나 aiohttp에는 스케쥴링을 더욱 효율적으로 처리할 수 있는 기능이 내장되어 있습니다.

aiohttp의 aiohttp.ClientSession 클래스는 일정한 간격으로 요청을 보내는 메소드를 제공합니다. 다음은 이를 이용한 스케쥴링 처리 예제입니다.

import asyncio
from aiohttp import ClientSession

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

async def make_requests():
    urls = ['https://example.com', 'https://google.com', 'https://twitter.com']
    
    async with ClientSession() as session:
        while True:
            for url in urls:
                response = await fetch(session, url)
                print(response)
            await session.close()
            await asyncio.sleep(5)  # 5초 대기 후 다음 작업 실행

loop = asyncio.get_event_loop()
loop.run_until_complete(make_requests())

위 코드에서 ClientSession 클래스의 request() 메소드를 이용하여 각 URL에 대한 요청을 보냅니다. session.close() 메소드를 사용하여 각 요청이 완료될 때마다 세션을 닫습니다. 그리고 asyncio.sleep() 함수를 사용하여 5초 동안 대기한 후 다음 작업을 실행합니다.

aiohttp의 스케쥴링 기능을 사용하면 asyncio 패키지를 직접 사용하는 것보다 코드를 간결하게 작성할 수 있습니다.

결론

aiohttp를 사용하여 웹 애플리케이션을 개발할 때, 스케쥴링은 중요한 기능 중 하나입니다. asyncio와 aiohttp의 스케쥴링 기능을 적절하게 활용하여 애플리케이션의 반복 작업을 효율적으로 처리할 수 있습니다.