Solicitudes asíncronas en Python

Zeeshan Afridi 21 junio 2023
  1. Solicitudes asíncronas en Python
  2. Importancia de usar solicitudes asíncronas en Python
  3. la forma más fácil de escribir solicitudes asíncronas en Python
  4. Manejar solicitudes asíncronas en Python
  5. Bibliotecas de Python requeridas para solicitudes asincrónicas
  6. Solicitudes asincrónicas frente a solicitudes regulares
  7. Solicitudes Async en Python
Solicitudes asíncronas en Python

Hoy aprenderemos sobre las solicitudes asincrónicas; esta discusión conducirá al código de ejemplo para ver cómo podemos escribir solicitudes asincrónicas en Python.

Solicitudes asíncronas en Python

Las solicitudes asincrónicas son el corazón de nuestro sistema. Podemos pensar en ellos de la siguiente manera:

Cuando un usuario carga nuestro sitio (sitio web o aplicación web), el usuario inmediatamente comienza a ver el contenido. Pero no está del todo listo. Entonces cargamos el contenido de forma asincrónica en segundo plano mientras el usuario continúa interactuando con la página.

Estas solicitudes no bloquean la ejecución del código posterior mientras esperan una respuesta. Eso significa que otro código puede continuar ejecutándose mientras se procesa la solicitud.

Puede ser útil cuando se trata de recursos externos, como llamadas API, que pueden tardar un tiempo en responder. También puede hacer que su código responda mejor, ya que la interfaz de usuario puede continuar actualizándose mientras se procesa una solicitud.

Importancia de usar solicitudes asíncronas en Python

Las solicitudes asíncronas son una excelente manera de mejorar el rendimiento de nuestra aplicación Python. Cuando se realiza una solicitud, el intérprete de Python puede continuar ejecutando otro código mientras se procesa la solicitud.

Puede causar un aumento significativo en la velocidad, especialmente para aplicaciones que realizan muchas solicitudes. Sin embargo, los siguientes son algunos puntos esenciales que debe recordar al usar solicitudes asincrónicas.

  1. Primero, debemos evitar hacer demasiadas solicitudes simultáneamente. El intérprete puede abrumarse y ralentizarse si hacemos demasiadas solicitudes.
  2. En segundo lugar, debemos estar preparados para manejar los errores. Si una solicitud falla, el intérprete no puede continuar ejecutando el código.

En general, las solicitudes asincrónicas son una gran herramienta para mejorar el rendimiento de nuestra aplicación Python. Pero, úsalo con cuidado; pueden ayudar a que nuestra aplicación funcione más rápido y sin problemas.

la forma más fácil de escribir solicitudes asíncronas en Python

Las solicitudes asíncronas se realizan utilizando el módulo asyncio fácilmente. Además, la biblioteca asyncio de python proporciona herramientas para escribir código asíncrono. Por ejemplo, podemos usar asyncio.sleep() para pausar una rutina y asyncio.wait() para esperar a que se complete una rutina.

Para escribir una solicitud asíncrona, primero debemos crear una rutina. Podemos hacerlo usando la función asyncio.ensure_future(). Una vez que tenemos una rutina, podemos usar la función asyncio.sleep() para pausarla y la función asyncio.wait() para esperar a que se complete.

Manejar solicitudes asíncronas en Python

Primero, si queremos ejecutar las solicitudes asincrónicas en Python, debe instalar la biblioteca de python de aiohttp usando el siguiente comando.

pip install aiohttp

Podemos usar solicitudes asincrónicas para mejorar el rendimiento de las aplicaciones de python. Al realizar solicitudes en paralelo, podemos acelerar drásticamente el proceso.

Hay algunas formas diferentes de manejar solicitudes asincrónicas en Python. La más popular es la biblioteca asyncio. Esta biblioteca proporciona herramientas poderosas para tratar con solicitudes asincrónicas.

Otra opción popular es la biblioteca grequests. Esta biblioteca es un poco más simple de usar que asyncio, pero puede ser igual de efectiva.

La opción que seleccionemos dependerá de nuestras necesidades específicas. Pero cualquiera que elijamos, estamos seguros de que veremos un aumento significativo en el rendimiento al hacer que nuestras solicitudes sean asincrónicas.

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)

Bibliotecas de Python requeridas para solicitudes asincrónicas

Podemos usar numerosas bibliotecas de Python para realizar solicitudes asíncronas. Los más populares son aiohttp y asyncio.

Biblioteca aiohttp para solicitudes asíncronas

aiohttp es una biblioteca que nos permite realizar solicitudes HTTP asíncronas. Está construido sobre asyncio y proporciona una interfaz simple para realizar solicitudes HTTP.

Biblioteca asyncio para solicitudes asíncronas

asyncio es una biblioteca que admite la programación asíncrona en Python. Nos permite escribir código asincrónico y facilita el uso de bibliotecas compatibles con asyncio.

Tanto aiohttp como asyncio están disponibles en PyPI y se pueden instalar usando pip.

import asyncio
import aiohttp
import json

from text_api_config import apikey

Solicitudes asincrónicas frente a solicitudes regulares

Podemos realizar dos tipos de solicitudes a un servidor: asíncronas y regulares. Las solicitudes asincrónicas se realizan en segundo plano mientras el usuario aún interactúa con la página. Las solicitudes típicas se realizan mientras se carga la página.

Las solicitudes asincrónicas son generalmente más rápidas y eficientes que las solicitudes normales, ya que no bloquean la carga de la página. Sin embargo, pueden ser más complejos de implementar y no todos los navegadores siempre los admiten.

Ejemplo de código:

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))

Producción :

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

el Módulo asyncio en Python

asyncio es un módulo para programación concurrente en Python. Proporciona un marco para administrar subprocesos, tareas y eventos simultáneos. asyncio se usa para escribir programas que pueden realizar múltiples tareas al mismo tiempo.

asyncio se basa en el concepto de rutinas. Una rutina es una función que puede suspender su ejecución y devolver el control a la persona que llama. Permite que varias corrutinas se ejecuten al mismo tiempo.

asyncio proporciona herramientas para administrar corrutinas, incluido un ciclo de eventos, un programador de tareas y estructuras de datos concurrentes.

asyncio es una forma eficiente de escribir programas concurrentes. Es fácil de usar y puede escalar a programas grandes. asyncio es una excelente opción para programas que requieren múltiples tareas al mismo tiempo.

Ejemplo de código:

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))

el Módulo aiohttp en Python

El módulo aiohttp es un cliente/servidor HTTP asíncrono para Python. Se basa en asyncio y proporciona una API simple para trabajar con HTTP.

El módulo aiohttp facilita el trabajo con HTTP en Python. Proporciona una API simple que facilita el envío y la recepción de solicitudes y respuestas HTTP.

El módulo aiohttp también proporciona una forma de ejecutar un servidor HTTP asíncrono.

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

Solicitudes Async en Python

Ejemplo de código:

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()

Producción :

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

Artículo relacionado - Python Async