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

Dodaj komentarz

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