Python의 비동기 요청

Zeeshan Afridi 2023년6월21일
  1. Python의 비동기 요청
  2. Python에서 비동기 요청 사용의 중요성
  3. Python에서 비동기 요청을 작성하는 가장 쉬운 방법
  4. Python에서 비동기 요청 처리
  5. 비동기 요청에 필요한 Python 라이브러리
  6. 비동기 요청과 일반 요청
  7. Python의 ‘비동기’ 요청
Python의 비동기 요청

오늘은 비동기 요청에 대해 알아보겠습니다. 이 토론은 Python에서 비동기 요청을 작성하는 방법을 확인하는 코드 예제로 이어집니다.

Python의 비동기 요청

비동기 요청은 우리 시스템의 핵심입니다. 다음과 같이 생각할 수 있습니다.

사용자가 당사 사이트(웹사이트 또는 웹 앱)를 로드하면 사용자는 즉시 콘텐츠를 보기 시작합니다. 그러나 아직 준비가 되지 않았습니다. 따라서 사용자가 페이지와 계속 상호 작용하는 동안 백그라운드에서 콘텐츠를 비동기식으로 로드합니다.

이러한 요청은 응답을 기다리는 동안 후속 코드의 실행을 차단하지 않습니다. 즉, 요청이 처리되는 동안 다른 코드가 계속 실행될 수 있습니다.

응답하는 데 시간이 걸릴 수 있는 API 호출과 같은 외부 리소스를 처리할 때 유용할 수 있습니다. 또한 요청이 처리되는 동안 UI가 계속 업데이트될 수 있으므로 코드 응답성을 높일 수 있습니다.

Python에서 비동기 요청 사용의 중요성

비동기 요청은 Python 애플리케이션의 성능을 향상시키는 좋은 방법입니다. 요청이 있으면 Python 인터프리터는 요청이 처리되는 동안 다른 코드를 계속 실행할 수 있습니다.

특히 많은 요청을 하는 애플리케이션의 경우 속도가 크게 증가할 수 있습니다. 그러나 다음은 비동기 요청을 사용할 때 기억해야 할 몇 가지 필수 사항입니다.

  1. 첫째, 동시에 너무 많은 요청을 하지 않아야 합니다. 우리가 너무 많은 요청을 하면 통역사는 압도당하고 속도가 느려질 수 있습니다.
  2. 둘째, 오류를 처리할 준비가 되어 있어야 합니다. 요청이 실패하면 인터프리터는 코드 실행을 계속할 수 없습니다.

전반적으로 비동기 요청은 Python 애플리케이션의 성능을 향상시키는 훌륭한 도구입니다. 그러나 신중하게 사용하십시오. 그들은 우리의 응용 프로그램이 더 빠르고 원활하게 실행되도록 도울 수 있습니다.

Python에서 비동기 요청을 작성하는 가장 쉬운 방법

비동기식 요청은 asyncio 모듈을 사용하여 쉽게 이루어집니다. 또한 Python의 asyncio 라이브러리는 비동기 코드를 작성하는 도구를 제공합니다. 예를 들어 asyncio.sleep()을 사용하여 코루틴을 일시 중지하고 asyncio.wait()를 사용하여 코루틴이 완료될 때까지 기다릴 수 있습니다.

비동기 요청을 작성하려면 먼저 코루틴을 생성해야 합니다. asyncio.ensure_future() 함수를 사용하여 이를 수행할 수 있습니다. 코루틴이 있으면 asyncio.sleep() 함수를 사용하여 일시 중지하고 asyncio.wait() 함수를 사용하여 완료될 때까지 기다릴 수 있습니다.

Python에서 비동기 요청 처리

먼저 Python에서 비동기 요청을 실행하려면 다음 명령을 사용하여 aiohttp의 Python 라이브러리를 설치해야 합니다.

pip install aiohttp

비동기 요청을 사용하여 Python 애플리케이션의 성능을 향상시킬 수 있습니다. 병렬로 요청하면 프로세스 속도를 크게 높일 수 있습니다.

Python에서 비동기 요청을 처리하는 몇 가지 다른 방법이 있습니다. 가장 인기 있는 것은 asyncio 라이브러리입니다. 이 라이브러리는 비동기 요청을 처리하기 위한 강력한 도구를 제공합니다.

또 다른 인기 있는 옵션은 grequests 라이브러리입니다. 이 라이브러리는 asyncio보다 사용하기 조금 더 간단하지만 그만큼 효과적일 수 있습니다.

우리가 선택하는 옵션은 특정 요구 사항에 따라 다릅니다. 그러나 우리가 무엇을 선택하든 요청을 “비동기"로 만들면 상당한 성능 향상을 볼 수 있을 것입니다.

import grequests

urls = [
    "http://www.heroku.com",
    "http://tablib.org",
    "http://httpbin.org",
    "http://python-requests.org",
    "http://kennethreitz.com",
]

rs = (grequests.get(u) for u in urls)
grequests.map(rs)

비동기 요청에 필요한 Python 라이브러리

비동기 요청을 만들기 위해 수많은 Python 라이브러리를 사용할 수 있습니다. 가장 인기 있는 것은 aiohttpasyncio입니다.

비동기 요청을 위한 aiohttp 라이브러리

aiohttp는 비동기 HTTP 요청을 할 수 있게 해주는 라이브러리입니다. 이것은 asyncio 위에 구축되었으며 HTTP 요청을 만들기 위한 간단한 인터페이스를 제공합니다.

비동기 요청을 위한 asyncio 라이브러리

asyncio는 Python에서 비동기 프로그래밍을 지원하는 라이브러리입니다. 이를 통해 비동기 코드를 작성할 수 있고 asyncio를 지원하는 라이브러리를 쉽게 사용할 수 있습니다.

aiohttpasyncio는 모두 PyPI에서 사용할 수 있으며 pip를 사용하여 설치할 수 있습니다.

import asyncio
import aiohttp
import json

from text_api_config import apikey

비동기 요청과 일반 요청

서버에 대한 두 가지 유형의 요청(비동기 및 일반)을 만들 수 있습니다. 사용자가 여전히 페이지와 상호 작용하는 동안 백그라운드에서 비동기식 요청이 이루어집니다. 일반적인 요청은 페이지가 로드되는 동안 이루어집니다.

비동기 요청은 일반적으로 페이지 로드를 차단하지 않기 때문에 일반 요청보다 빠르고 효율적입니다. 그러나 구현하기가 더 복잡할 수 있으며 모든 브라우저가 항상 이를 지원하는 것은 아닙니다.

코드 예:

import requests
import time

start_time = time.time()

for number in range(1, 151):
    url = f"https://pokeapi.co/api/v2/pokemon/{number}"
    resp = requests.get(url)
    pokemon = resp.json()
    print(pokemon["name"])

print("--- %s seconds ---" % (time.time() - start_time))

출력:

bulbasaur
ivysaur
venusaur
....
dragonair
dragonite
mewtwo
--- 68.17992424964905 seconds

Python의 asyncio 모듈

asyncio는 Python의 동시 프로그래밍을 위한 모듈입니다. 동시 스레드, 작업 및 이벤트를 관리하기 위한 프레임워크를 제공합니다. asyncio는 여러 작업을 동시에 수행할 수 있는 프로그램을 작성하는 데 사용됩니다.

asyncio는 코루틴의 개념을 기반으로 합니다. 코루틴은 실행을 일시 중단하고 호출자에게 다시 제어권을 양보할 수 있는 함수입니다. 여러 코 루틴을 동시에 실행할 수 있습니다.

‘asyncio’는 이벤트 루프, 작업 스케줄러 및 동시 데이터 구조를 포함하여 코루틴을 관리하기 위한 도구를 제공합니다.

asyncio는 동시 프로그램을 작성하는 효율적인 방법입니다. 사용하기 쉽고 대규모 프로그램으로 확장할 수 있습니다. asyncio는 동시에 여러 작업이 필요한 프로그램에 탁월한 선택입니다.

코드 예:

import asyncio
import aiohttp
import json
from text_api_config import apikey


async def gather_with_concurrency(n, *tasks):
    semaphore = asyncio.Semaphore(n)

    async def sem_task(task):
        async with semaphore:
            return await task

    return await asyncio.gather(*(sem_task(task) for task in tasks))

Python의 aiohttp 모듈

aiohttp 모듈은 Python용 비동기 HTTP 클라이언트/서버입니다. asyncio를 기반으로 하며 HTTP 작업을 위한 간단한 API를 제공합니다.

aiohttp 모듈을 사용하면 Python에서 HTTP로 쉽게 작업할 수 있습니다. HTTP 요청 및 응답을 쉽게 보내고 받을 수 있는 간단한 API를 제공합니다.

aiohttp 모듈은 비동기 HTTP 서버를 실행하는 방법도 제공합니다.

import asyncio
import aiohttp
import json
from text_api_config import apikey


async def main():
    conn = aiohttp.TCPConnector(limit=None, ttl_dns_cache=300)
    session = aiohttp.ClientSession(connector=conn)
    urls = [summarize_url, ner_url, mcp_url]
    conc_req = 3

Python의 ‘비동기’ 요청

코드 예:

import queue


def task1(name, s_queue):
    if s_queue.empty():
        print(f"Task {name} has nothing to do")
    else:
        while not s_queue.empty():
            cnt = s_queue.get()
            total = 0
            for x in range(cnt):
                print(f"Task {name} is working now.")
                total += 1
            print(f"Task {name} is working with a total of: {total}")


def s_async():
    s_queue = queue.Queue()
    for work in [2, 5, 10, 15, 20]:
        s_queue.put(work)
    tasks = [
        (task1, "Async1", s_queue),
        (task1, "Async2", s_queue),
        (task1, "Async3", s_queue),
    ]
    for t, n, q in tasks:
        t(n, q)


if __name__ == "__main__":
    s_async()

출력:

Task Async1 is running now.
Task Async1 is running with a total of: 2
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 5
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 10
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 15
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 20
Task Async3 has nothing to do
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

관련 문장 - Python Async