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:
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
- 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/
Greetings! Very useful advice within this article! It’s the little changes which will make the greatest changes.
Many thanks for sharing!
😉