Celery, Python'da dağıtık iş kuyruğu oluşturmanızı sağlayan oldukça kullanışlı bir kütüphane. Bu yazımızda bu kütüphanenin basit bir şekilde django üzerinde nasıl kullanıldığından bahsedeceğiz. Ve tahmin ediyorum ki bu kütüphaneyi daha önce duymamış olan arkadaşar yazıdan sonra kullanmaya başlayacaktır. Size şöyle bir örnek ile açıklayalım. Örneğin sisteme kullanıcı kaydı alıyorsunuz ve kayıt alırken de her kullanıcı kayıt olduğunda sistem bana mail olarak bunu bildirsin dediniz. İşte bu noktada eğer kodunuz şu tarz ise;
Broker
İş kuyruğu olarak broker seçmemi gerekiyor. Yani bizim iş kuyruğu oluşturmamızı sağlayan asıl yapı olacak. Bunun için RabbitMQ veya Redis seçilebilir. Biz RabbitMQ kullanacağız. Kurulumu :
proje/proje/celery.py
proje/proje/__init__.py
Supervisor
/etc/supervisor/config.d/proje.conf
Kaynakça
kullanıcı verilerini al doğruluğunu kontrol et kaydet mail at sonuç dönBildiğiniz gibi mail atma işlemi biraz zaman alan bir işlem olduğu için bu yapıda kullanıcıyı sistemin mail atması için gereksiz yere bekletmiş olacaksınız ve kullanılabilirlik düşmüş olacaktır. İşte Celery tam bu noktada devreye gire bir kütüphane. Burada mail için bir kuyruk oluşturuyorsunuz ve mail atma işlemi ile artık Celery ilgileniyor. Siz kullanıcıya sonucu direk dönerken Celery arka tarafta mail atma işlemini tamamlıyor. Hemen django ile kullanımına geçelim.
Broker
İş kuyruğu olarak broker seçmemi gerekiyor. Yani bizim iş kuyruğu oluşturmamızı sağlayan asıl yapı olacak. Bunun için RabbitMQ veya Redis seçilebilir. Biz RabbitMQ kullanacağız. Kurulumu :
sudo apt-get install rabbitmq-serverEğer ubuntu kullanıyorsanız komut ile kurabilirsiniz. Kurulduktan sonra kendisi servis olarak ayağa kalkacaktır. Kurulum için ayrıntılı bilgiyi buradan ulaşabilirsiniz. Şimdi Celery kütüphanesini kuralım.
pip install celeryproje adında bir projemiz olduğunu düşünürsek görünümü şu şekilde olacaktır.
proje ├── manage.py └── proje ├── __init__.py ├── settings.py ├── urls.py └── wsgi.pyİlk önce yapmamız gereken projemizin ayar dizinine celery.py dosyası oluşturmak ve içerisine şu komutları yazmak.
proje/proje/celery.py
from __future__ import absolute_import import os from celery import Celery #celery için django default settings dosyasını gösteriyoruz os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proje.settings') from django.conf import settings #celery app oluşturuyoruz app = Celery('proje') app.config_from_object('django.conf:settings') #bu fonksiyon sayesinde projemizde her uygulama içerisindeki tasks.py içeriği celery tarafından yorumlanacaktır. app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))Şimdi aynı dizindeki __init__.py dosyasını düzenlememiz gerekiyor.
proje/proje/__init__.py
from __future__ import absolute_import from .celery import app as celery_appArtık task oluşturabiliriz. Bunun için ilk önce bir uygulama oluşturalım. ve içerisine tasks.py adında tasklarımızı yazacağımız bir dosya oluşturalım.
#python2.7 manage.py startapp uygulama #tree proje ../proje ├── manage.py ├── proje │ ├── __init__.py │ ├── __init__.pyc │ ├── settings.py │ ├── settings.pyc │ ├── urls.py │ └── wsgi.py └── uygulama ├── __init__.py ├── admin.py ├── migrations │ └── __init__.py ├── models.py ├── tasks.py ├── tests.py └── views.pyŞimdi tasks.py dosyasının içeriğini dolduralım.
from __future__ import absolute_import from celery import shared_task @shared_task def mail_gonder(): mail() # mail gonder fonksiyonu oldugu kabul edilmiştir.Celery ile fonksiyon oluşturmak bu kadar basit. Bu fonksiyonu views.py dosyası içerisinde şu şekilde kullanabiliriz.
from uygulama.tasks import mail_gonder def index(request) .... mail_gonder.delay() ....Kullanımı da oldukça basittir. Burada fonksiyonu doğrudan adıyla değilde delay(/) fonskiyonu ile çağırdığımıza dikkat edin. Eğer doğrudan adı ile çağırırsanız, normal bir fonksiyondan bir farkı olmaz ve işlenmesi beklenir. Burada artık bu satır işlendiği anda fonksiyon iş kuyruğuna atılacak ve hiç bekleme yapmadan kod satırları işlenmeye devam edilecektir. Rabbitmq serverımız kurduk ve çalışır bir vaziyetteyse celeryi ayağa kaldırabiliriz demektir. Eğer RabbitMQ ayakta değilse ilk önce onu ayağa kaldırmalısınız.
service rabbitmq-server startDaha sonra proje ana dizinine giderek Celery'i ayağa kaldırmalıyız.
celery -A proje worker -l infoBu komutu verdikten sonra Celery ayağa kalkacak ve herşey kullanıma hazır demektir. Zaten komut çıktısını incelerseniz yazmış olduğunuz taskların kullanıma hazır olduğu çıktısını görebilirsiniz. index fonksiyonu çağrıldığı anda da komut satırında taskların düzgün bir şekilde düştüğünü izleyebilirsiniz. Tabi gördüğünüz gibi Celery'i komut satırında çalıştırdık. Bu durumun böyle olmaması ve her zaman çalışabilmesi için Supervisor'ı kullanacağız.
Supervisor
sudo pip install supervisorSupervisor config dosyasını şu şekilde oluşturalım.
/etc/supervisor/config.d/proje.conf
[program:proje-celery] command=celery --app=proje.celery:app worker --loglevel=INFO directory=proje_path/proje user=user_name numprocs=1 stdout_logfile=/log_path/logs/celery-worker.log stderr_logfile=/log_path/logs/celery-worker.log autostart=true autorestart=true startsecs=10 stopwaitsecs = 600 killasgroup=true priority=998Supervisor işleme alması için şu komutları çalıştıralım.
# supervisorctl reread # supervisorctl reloadArtık her şey kullanıma hazır. Mail atmak istediğimiz zaman mail işlemi celery tarafından kuyruğu alınacaktır ve kuyrukta işlenecektir.
Kaynakça