DEV Community

wguii
wguii

Posted on

Uso da programação assíncrona em Python visando um sistema responsivo e performático

Introdução

Na era dos serviços on-line, surge uma demanda cada vez maior por sistemas responsivos, performáticos e de alta capacidade de escalabilidade. O uso da programação assíncrona, quando aplicada corretamente, se mostra muito eficaz na obtenção destes atributos de qualidade durante o desenvolvimento de um software. Este artigo busca mostrar os benefícios e os contrapontos do uso da programação assíncrona em Python em sistemas "I/O-bound" (altamente dependentes de input e output) e outras tarefas que necessitam de execução paralela.

Conceitos de programação assíncrona

Computadores executam softwares de forma sequencial, isto é, uma instrução após a outra. Um software geralmente realiza múltiplas tarefas, e nem sempre faz sentido esperar que uma tarefa termine antes de iniciar a próxima (SKVORTSOV, 2021).

Segundo Skvortsov, a habilidade de um programa de lidar com múltiplas tarefas se chama "concurrency", e é a base para entendermos melhor como a programação assíncrona funciona.

A programação assíncrona se apresenta como um paradigma de controle de fluxo que utiliza técnicas de manejo estratégico de "concurrency" para criar um ambiente onde tarefas são iniciadas de forma paralela, permitindo com que o sistema continue "escutando" por novas tarefas enquanto executa outras, diferente da programação síncrona tradicional. Com isto, a programação assíncrona otimiza o uso dos recursos do sistema e melhora o tempo de resposta em aplicações que dependem intensamente de operações de entrada e saída (I/O).

Image description

Segundo o Teorema de CAP (BREWER, 2000), sistemas distribuídos não conseguem garantir simultaneamente consistência, disponibilidade e tolerância a partições. No contexto da programação assíncrona, o foco fica com a entrega de tolerância a partição e altíssima disponibilidade, sacrificando a consistência. Embora não "resolva" o problema do teorema, geralmente é possível administrar melhor o ônus do "trade-off" utilizando programação assíncrona para aplicações que se beneficiam de alta responsividade.

Image description

Programação assíncrona em Python

Em Python, segundo a própria documentação da linguagem, temos a biblioteca nativa asyncio como a principal ferramenta para utilização da programação assíncrona. Através dela, podemos ditar "coroutines" utilizando as palavras reservadas async e await.

import asyncio

async def main():
    print('Olá ...')
    await asyncio.sleep(1)
    print('... Mundo!')

asyncio.run(main())

Enter fullscreen mode Exit fullscreen mode

Aqui, definimos uma função como assíncrona utilizando async e executamos a tarefa assíncrona ("coroutine") "asyncio.sleep(1)" com await. Se uma "coroutine" não for "aguardada", isto é, corretamente identificada com await, a mesma não será executada.

Em um outro exemplo, desta vez mais aplicado, temos uma função do código-fonte de um chatbot da plataforma "Discord":

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix="!", intents = intents, case_insensitive=True)

@bot.event
async def on_message(self, message):
    if "olá" in message.content.lower():
        await ctx.send("Olá, como você está?!")

Enter fullscreen mode Exit fullscreen mode

Aqui, importamos discord.py, um wrapper para a API pública da plataforma. Inicializamos o bot na variável "bot" e utilizamos o método "bot.event" como um decorator (wrapper de funções), que nos permite "ouvir" por mensagens dentro da plataforma. Verificamos então se a string "olá" está presente em "message.content.lower()", onde "message" é a mensagem enviada no chat da plataforma.

Importante notar aqui novamente o uso das palavras reservadas async, na declaração da função, inicializando-a como uma função assíncrona e await em "ctx.send", que envia uma mensagem dentro da plataforma se a condição do "if statement" for verdadeira. Dessa forma, esta função roda de maneira não bloqueante, ou seja, não impede a aplicação de executar outras tarefas.

Image description

Benefícios e contrapontos da programação assíncrona

Fica mais claro entender os benefícios da programação assíncrona quando observamos exemplos práticos como a construção de um chatbot, principalmente quando começamos a escalar esses tipos de sistemas. É de suma importância que aplicações dessa natureza continuem disponíveis para receber e executar novas requisições de tarefas sem bloqueios. Em nosso exemplo, receber mensagens dentro da plataforma e reagir de acordo.

Apesar dos benefícios evidentes em termos de responsividade e escalabilidade, a programação assíncrona introduz complexidade no código e dificulta o tratamento de bugs por conta de como a aplicação é executada, exigindo maior planejamento arquitetural e o uso de boas práticas.

Em aplicações "CPU-bound", a introdução da programação assíncrona não só não é viável como muitas vezes sobrecarrega a aplicação, gerando um efeito contrário ao esperado.

Conclusão

A programação assíncrona, por sua flexibilidade e eficiência, se tornou uma das ferramentas-chave para a criação de sistemas que necessitam de responsividade e escalabilidade, podendo suportar grandes cargas. Em Python, quando uma função é declarada com a palavra reservada async, ela se torna uma "coroutine", e utilizando técnicas de manejo de "concurrency", pode pausar e retomar sua execução conforme necessário. O operador await é usado para chamar outras "coroutines" e gerenciar operações paralelas de forma eficiente dentro de uma aplicação (SKVORTSOV, 2021).

Referências Bibliográficas

BREWER, Eric A. Towards robust distributed systems (abstract). In: Proceedings of the nineteenth annual ACM symposium on Principles of distributed computing. New York: ACM, 2000. p. 7-10. Disponível em: https://doi.org/10.1145/343477.343502. Acesso em: 11 maio 2025.

PYTHON SOFTWARE FOUNDATION. asyncio — Asynchronous I/O. Disponível em: https://docs.python.org/3/library/asyncio.html. Acesso em: 11 maio 2025.

SKVORTSOV, Victor. Python behind the scenes #12: how async/await works in Python. 24 ago. 2021. Disponível em: https://tenthousandmeters.com/blog/python-behind-the-scenes-12-how-async-await-works-in-python/. Acesso em: 11 maio 2025.

KOKALKO, Mykola. Using asynchronous programming in Python to improve application performance. The American Journal of Engineering and Technology, [S.l.], v. 6, n. 12, p. 51–58, 2024. Disponível em: https://doi.org/10.37547/tajet/Volume06Issue12-06. Acesso em: 11 maio 2025.

Top comments (0)