Python – Celery – distributed Task Queue

Ostatnio miałam okazje pobawić sie pythonowym narzędziem do tworzenia zadań wykonywanych równolegle. Narzędzie o tyle ciekawe, że tak naprawdę – nawet dla laika wymaga – 1 dzień instalacji oraz 2-3 dni by zrozumieć filozofie tworzenia zadań i ich wykorzystania w praktyce.

O Celery można poczytać tutaj:

http://www.celeryproject.org/

A tutaj najprostszy opis instalacji oraz przykładowy skrypt w pythonie do tworzenia zadań:

1. instalujemy Oracle Virtual Box, Vagrant

2. instalujemy Centos7:

vagrant init centos/7
vagrant up

3. teraz instalujemy RabbitMQ (bedzie to message broker – czyli zbior kolejek, gdzie beda przetwarzane zadania)

4. Sciagamy i aktualizujemy najnowsza wersje Epel

sudo yum install epel-release
sudo yum update
sudo reboot

5. Instalujemy Erlanga

  1. cd ~
    wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
    sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
    sudo yum install erlang

6. Instalujemy RabbitMQ

cd ~
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-3.6.1-1.noarch.rpm
sudo rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo yum install rabbitmq-server-3.6.1-1.noarch.rpm

7. dodajemy do „autostartu”

sudo systemctl start rabbitmq-server.service
sudo systemctl enable rabbitmq-server.service

8. Status RabbitMQ sprawdzamy tak

sudo rabbitmqctl status

9. Konsola RabbitMQ

sudo rabbitmq-plugins enable rabbitmq_management
sudo chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/

10. Stworzenie RabbitMQ web admin

sudo rabbitmqctl add_user mqadmin mqadminpassword
sudo rabbitmqctl set_user_tags mqadmin administrator
sudo rabbitmqctl set_permissions -p / mqadmin ".*" ".*" ".*"

11. Konsola RabbitMQ dostepna jest pod adresem:

http://[your-vultr-server-IP]:15672/

12. Jeszcze kilka ustawien by Celery widzialo RabbitMQ

sudo rabbitmqctl add_user myuser mypassword
$ sudo rabbitmqctl add_vhost myvhost
$ sudo rabbitmqctl set_user_tags myuser mytag
$ sudo rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"

13. Teraz instalujemy Python 3.6 oraz Celery

sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
sudo yum update
sudo yum install -y python36u python36u-libs python36u-devel python36u-pip
pip install celery

14. a oto najprostszy skrypt do testowania

mkdir ~/downloadedFiles ~/downloaderApp; cd ~/downloaderApp

from celery import Celery
import urllib.request
import os

# Where the downloaded files will be stored
BASEDIR="/home/celery/downloadedFiles"

# Create the app and set the broker location (RabbitMQ)
app = Celery('downloaderApp',
             backend='rpc://',
             broker='pyamqp://guest@localhost//')

@app.task
def download(url, filename):
    """
    Download a page and save it to the BASEDIR directory
      url: the url to download
      filename: the filename used to save the url in BASEDIR
    """
    response = urllib.request.urlopen(url)
    data = response.read()
    with open(BASEDIR+"/"+filename,'wb') as file:
        file.write(data)
    file.close()

@app.task
def list():
    """ Return an array of all downloaded files """
    return os.listdir(BASEDIR)

Co to robi ? Uruchamia aplikacje celery – która jest zarządcą workerow. Później uruchamia workery, które jak tylko pojawi się zadanie w kolejce przetwarzają je – w tym wypadku ściągają listę plików z zadanego adresu URL.

Uruchamiamy „zarządcę”:

celery -A downloaderApp worker --loglevel=debug

A w drugiej konsoli – i podajemy po kolei zadania:

cd ~/downloaderApp
python


from downloaderApp import download,list
r = download.delay('https://www.python.org/static/community_logos/python-logo-master-v3-TM.png', 'python-logo.png')
r.ready()
from downloaderApp import download,list
r = list.delay()
r.ready()
r.get(timeout=1)

15. Kilka przydatnych linkow:

https://rk.edu.pl/pl/asynchroniczne-zadania-celery-w-projektach-django/

Opublikowany w Inne

2 myśli na “Python – Celery – distributed Task Queue

  1. Greetings! Very useful advice within this article! It’s the little changes which will make the greatest changes.
    Many thanks for sharing!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *