Como utilizar o Celery para paralelização de atividades em Python
O Celery é uma fila de tarefas assíncrona de trabalho, implementada em python, com base na passagem de mensagens distribuídas. Está focado na operação em tempo real, mas também oferece suporte ao agendamento. Aqui será tratado sobre essas filas, utilizando o redis como broker. Já o agendamento será tratado em outro post.
Why celery?
O celery tem uma sequência de vantagens e facilidades para a sua implantação, que facilitam o trabalho do desenvolvedor e ainda proporciona escalabilidade para sistemas. A seguir estão os pontos positivos de utilizá-lo.
- O celery é utilizado em sistemas em produção para processar milhões de tarefas por dia;
- Simples instalação e adaptação em aplicações;
- Suporta vários categorias de Brokers: RabbitMQ, Redis, Amazon SQS, Zookeeper. Como dito antes, nesta aplicação iremos utilizar o Redis;
- Fácil para integrar com aplicações Web utilizando Pacotes de Integração;
- Grandes sistemas e aplicações utilizando: Mozzila, Instagram, AdRoll, entre outros.
Setup da Aplicação
Para instalar os pacotes em python, iremos utilizar o virtual env e o gerenciador de pacotes do python. Então antes de o instalar, vamos configurar o ambiente com estas ferramentas.
Instalando e Configurando o Virtualenv
O virtualenv pode ser instalado através do gerenciador de pacotes do python, o pip. Assim, primeiramente iremos instalar em seu sistema operacional. Irei apresentar um exemplo de instalação em derivados do Debian. Mais informações sobre a instalação do pip podem ser encontradas no Site Oficial do pip.
# sudo apt-get install python3-pip python3 python-dev
Com o gerenciador de pacotes instalado, é possível instalar o virtual env.
$ pip install virtualenv
Agora podemos criar ambientes virtuais, que irá instalar os pacotes em uma pasta e não no sistema por inteiro. Assim, vamos criar uma pasta para o desenvolvimento, o nosso virtualenv e o ativá-lo.
$ cd ~
$ mkdir celery_queue
$ cd celery_queue
$ virtualenv .env
$ source .env/bin/activate
Desta forma, com o ambiente virtual instalado e ativado, todos os pacotes instalados pelo pip serão alocados dentro da pasta .env/libs.
Instalando o Celery
Após ativado o virtualenv, é muito simples instalar o Celery.
$ pip install Celery redis
Instalando Redis
A instalação do Redis para outros sistemas operacionais pode ser conferida no
site oficial do Redis. Porém, para a maioria dos casos, a instalação básica a seguir será feita corretamente.
$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ cd redis-stable
$ make
Após estes procedimentos, basta apenas iniciar o Redis.
$ redis-server
Criando a primeira Task
As tasks do celery podem ser invocadas e enfileiradas. Para iniciar, o primeiro passo é criar um módulo que será decorado pelo celery como uma de suas tasks.
Vamos criar o arquivo a seguir com o seguinte código:
from celery import Celery
import time
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def running(runner, vel):
dist = 0
while 1:
time.sleep(2)
dist += vel
print("Corredor {0} esta em {1} metros".format(runner, dist))
Nas primeiras linhas existem os imports do celery e da biblioteca de time do python.
Logo após, é criada a instância do celery, passando o nome do worker(‘tasks’) e a url em que o broker atende, que no caso é: redis://localhost:6379/0.
Logo em seguida é criado um método que simula a distância em que um corredor está. O método recebe o nome do corredor e a sua velocidade. E a cada um segundo imprime o nome do corredor e quantos metros este já percorreu.
O interessante deste método é verificar que ao ser chamado várias vezes, será possível visualizar os corredores em suas posições atuais, representado as filas em execução.
Então, vamos ao teste. Para tal, vamos iniciar o worker com o nome da instância do celery que criamos no código: tasks.
$ celery -A tasks worker --loglevel=info
Pronto, o servidor do celery está funcionando e aguardando a solicitações de novas filas.
Para orquestrar as requisições, abra uma nova aba do terminal em sua máquina, ative o virtual env nessa nova máquina e inicie um terminal interativo do python.
$ source .env/bin/activate
$ python
Agora devemos importar o módulo tasks e assim poderemos utilizar o método.
Vamos utilizar três corredores com suas velocidades, em metros, diferentes.
- Tiago Assunção com velocidade de 3m;
- Leonardo Bites com velocidade de 4m;
- Silvia Mendes com velocidade de 5m.
E a cada um segundo será apresentado na saída do worker do Celery a posição de cada um deles.
from tasks import running
running.delay('Tiago Assunção', 3)
running.delay('Leonardo Bites', 4)
running.delay('Silvia Mendes', 5)
Assim, na saída do worker é possível verificar os resultados do worker.
Corredor Tiago Assunção esta em 3 metros
Corredor Tiago Assunção esta em 6 metros
Corredor Tiago Assunção esta em 9 metros
Corredor Leonardo Bites esta em 4 metros
Corredor Tiago Assunção esta em 12 metros
Corredor Leonardo Bites esta em 8 metros
Corredor Tiago Assunção esta em 15 metros
Corredor Leonardo Bites esta em 12 metros
Corredor Silvia Mendes esta em 5 metros
Corredor Tiago Assunção esta em 18 metros
Corredor Leonardo Bites esta em 16 metros
Corredor Silvia Mendes esta em 10 metros
Corredor Tiago Assunção esta em 21 metros
Corredor Leonardo Bites esta em 20 metros
Corredor Silvia Mendes esta em 15 metros
Corredor Tiago Assunção esta em 24 metros
Corredor Leonardo Bites esta em 24 metros
Corredor Silvia Mendes esta em 20 metros
Corredor Tiago Assunção esta em 27 metros
Corredor Leonardo Bites esta em 28 metros
Corredor Silvia Mendes esta em 25 metros
Corredor Tiago Assunção esta em 30 metros
Corredor Leonardo Bites esta em 32 metros
Corredor Silvia Mendes esta em 30 metros
Conclusão
O celery é uma ótima ferramenta para a paralelização de atividades, que tem um grande suporte para escalabilidade.
Este tutorial explica apenas o começo do potencial desta ferramenta. Pois ela possui suporte para criar várias filas simultâneas com diferentes tasks. É possível limitar o número máximo de concorrência do worker. O celery cede suporte para cancelar as tasks programaticamente e possui um sistema de agendamento bastante completo. Todos estes pontos são assuntos de outros posts que virão.
Caso não deseje esperar os próximos posts, mas deseja saber mais sobre esta poderosa ferramenta, acesse a documentação oficial no próprio site do Celery.`
About author
Você pode gostar também
Entenda as diferenças entre MySQL Community, MySQL Enterprise, Percona e MariaDB
Nesta publicação quero explicar algumas diferenças interessantes entre o MySQL Community, MySQL Enterprise, Percona e MariaDB. Normalmente sempre abordamos algumas coisas em nosso curso de MySQL, mas o tempo sempre
Gerando Dados Aleatórios com Paralelização no Shell: Guia Prático
Gerar dados aleatórios com paralelização no shell. Falando assim parece até alguma coisa muito importante ou difícil, mas vamos entender sua utilidade na prática. Vez ou outra preciso de uma
Entenda o que é um chatbot e como ele pode revolucionar o atendimento ao cliente
A procura por soluções de chatbot (atendimento automatizado por chat) vem crescendo muito nos últimos tempos, ainda mais nestes tempos de pandemia. Muitos criticam seu uso pois isso retira uma