[파이썬] 소켓 통신의 비동기 처리

소켓 통신은 네트워크 상에서 데이터를 주고받기 위한 핵심 개념입니다. 하지만 소켓 통신의 동기 방식은 요청과 응답의 차이에 따른 지연 문제를 야기할 수 있습니다. 이러한 문제를 해결하기 위해 비동기 처리를 사용할 수 있습니다. 이번 글에서는 파이썬에서 소켓 통신의 비동기 처리에 대해 알아보겠습니다.

asyncio와 aiohttp 모듈

파이썬에서 비동기 처리를 위해 사용되는 가장 일반적인 모듈은 asyncio입니다. asyncio는 비동기 I/O와 이벤트 루프를 제공하여 소켓 통신과 같은 작업을 효율적으로 처리할 수 있게 해줍니다. aiohttp는 asyncio 기반 웹 서버 및 클라이언트 프레임워크로, 웹 요청과 응답을 비동기로 처리할 수 있도록 도와줍니다.

import asyncio
import aiohttp

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

async def main():
    urls = ["https://www.example.com", "https://www.example2.com"]

    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            task = asyncio.ensure_future(fetch(session, url))
            tasks.append(task)

        responses = await asyncio.gather(*tasks)
        for response in responses:
            print(response)

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

위의 예시 코드는 aiohttp를 사용하여 비동기적으로 여러 웹 페이지를 요청하고 응답을 받는 방법을 보여줍니다. fetch 함수는 aiohttp의 ClientSession.get 메서드를 사용하여 비동기로 웹 페이지를 요청하고, main 함수에서는 asyncio.gather를 사용하여 모든 요청을 동시에 처리합니다.

소켓 통신과 asyncio의 결합

소켓 통신과 asyncio를 결합하여 비동기 처리를 적용하려면, asyncio.open_connection을 사용할 수 있습니다. 아래의 예시 코드는 open_connection을 사용하여 소켓 연결을 비동기로 처리하는 방법을 보여줍니다.

import asyncio

async def handle_client(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    print(f"Received {message} from {addr}")

    writer.close()

async def main():
    server = await asyncio.start_server(
        handle_client, '127.0.0.1', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())

위의 예시 코드는 asyncio의 start_server를 사용하여 비동기적으로 클라이언트의 연결을 처리하는 간단한 서버를 만드는 방법을 보여줍니다. handle_client 함수는 클라이언트로부터 데이터를 읽고, 메시지를 출력한 뒤 소켓을 닫습니다.

결론

이렇게 비동기 처리를 사용하여 소켓 통신을 더 효율적으로 처리할 수 있습니다. asyncio와 aiohttp를 함께 사용하면 웹 서버나 클라이언트에서도 비동기 처리를 적용할 수 있습니다. 비동기 처리를 사용하면 지연 시간을 최소화하고, 효율적인 네트워크 통신을 구현할 수 있습니다.