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

Introdução Com a expansão 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 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). Segundo o Teorema de CAP, em um sistema distribuído é impossível garantir simultaneamente consistência, disponibilidade e tolerância à partição (BREWER, 2000). Além de melhorar a responsividade, a utilização de técnicas assíncronas permite com que aplicações mantenham sua disponibilidade e funcionem mesmo diante de comunicações lentas ou falhas parciais na rede, sem bloquear a execução de outras tarefas. 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()) Aqui, definimos uma função como assíncrona utilizando async e executamos a tarefa assíncrona "asyncio.sleep(1)" com await. Se uma tarefa não for "aguardada", isto é, corretamente identificada com await, a mesma não será executada. Em um outro exemplo, dessa 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á?!") 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 permite "ouvirmos" 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 as 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. 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. Importante ressaltar que 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 utiliz

May 12, 2025 - 03:20
 0
Uso da programação assíncrona em Python visando um sistema responsivo e performático

Introdução

Com a expansão 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 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, em um sistema distribuído é impossível garantir simultaneamente consistência, disponibilidade e tolerância à partição (BREWER, 2000). Além de melhorar a responsividade, a utilização de técnicas assíncronas permite com que aplicações mantenham sua disponibilidade e funcionem mesmo diante de comunicações lentas ou falhas parciais na rede, sem bloquear a execução de outras tarefas.

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

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

Em um outro exemplo, dessa 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á?!")

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 permite "ouvirmos" 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 as 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.

Importante ressaltar que 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.