10 Haziran 2015 Çarşamba

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;
kullanıcı verilerini al
doğruluğunu kontrol et
kaydet
mail at
sonuç dön
Bildiğ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-server
Eğ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 celery
proje 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_app
Artı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 start
Daha sonra proje ana dizinine giderek Celery'i ayağa kaldırmalıyız.
celery -A proje worker -l info
Bu 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 supervisor
Supervisor 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=998
Supervisor işleme alması için şu komutları çalıştıralım.
# supervisorctl reread
# supervisorctl reload 
Artı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

0 yorum :

Yorum Gönder