Django ile zamanlanmış görev oluşturma (Django Celery Scheduled Tasks) işlemleri mail gönderimi gibi belirli görevlerin periyodik olarak tekrarlanması için kullanılır. 

Örneğin bir mail listeniz var ve belirli zamanlarda haber bülteni veya sisteminizin gelişimi ile alakalı yazdığınız yazılar var. Bu yazıları belirlenen zamanlarda müşterilerinize göndermek istiyorsunuz. İşte bu gibi durumlarda karşınıza "Zamanlanmış Görevler" çıkmaktadır.


Django ile zamanlanmış görev oluşturmak için Celery kütüphanesini kullanımı şu şekildedir. Biz server olarak Ubuntu 21.04 LTS kullanmaktayız. Kurulumlar Ubuntu 21.04, Django 3.2.9 ve Python 3.8 için anlatılmıştır.

1- Ubuntu için Redis kurulumunu yapıyoruz.

sudo apt update

sudo apt install redis-server

sonra redis konfigürasyon dosyasını açıp supervised satırını

supervised systemd 

olarak güncelliyoruz. 

 

2- Django için celery kurulumunu yapıyoruz.

pip install celery[redis]

 

3- settings.py dosyasına aşağıdaki komutları ekliyoruz.

CELERY_TIMEZONE = TIME_ZONE

CELERY_TASK_TRACK_STARTED = True

CELERY_BACKEND = os.environ.get("CELERY_BROKER", 'redis://localhost:6379/3')

CELERY_BROKER_URL = os.environ.get("CELERY_BROKER", "redis://localhost:6379/0")

CELERY_RESULT_BACKEND = os.environ.get("CELERY_BROKER", "redis://localhost:6379")

BROKER_URL = 'redis://localhost:6379/0'

CELERY_ACCEPT_CONTENT = ['application/json']

CELERY_TASK_SERIALIZER = 'json'

CELERY_RESULT_SERIALIZER = 'json'

 

4- settings.py nin bulunduğu klasördeki __init__.py dosyasına şu komutları ekliyoruz.

# This will make sure the app is always imported when

# Django starts so that shared_task will use this app.

from .celery import app as celery_app


__all__ = ('celery_app',)

 

5- app klasörünün içerisine tasks.py isminde dosya oluşturuyoruz ve içeriğine Scheduled Tasks için kullanılacak fonksiyonu yazıyoruz.

from __future__ import absolute_import

import datetime

from celery import shared_task

from django.utils import timezone

from datas.models import Data

from iotv6.debug import debug

from logs.models import Log

import logging

logger = logging.getLogger(__name__)


@shared_task

def zamanlanmis_gorev_1():

    logger.info("zamanlanmis_gorev_1")


6- settings.py dosyamızın INSTALLED_APPS listesine django_celery_beat i ekliyoruz. ve migrate ediyoruz.

INSTALLED_APPS = [

  '...'

    'django_celery_beat',

  

7- Ubuntu için supervisor kurulumunu yapıyoruz.

sudo apt update && sudo apt install supervisor

 

 8- /etc/supervisor/conf.d içerisine supervisor dosyalarımızı oluşturuyoruz. Burada 2 adet dosya oluşturacağız. Birincisi beat dosyası, ikincisi worker dosyası. Bu dosyaları server ımız başladığında otomatik olarak beat ve worker ın çalışması için yapılıyor.

iot_beat.conf içeriği:


[program:iotv6_beat]


command=/home/myproj/venvpy3/bin/celery -A iotv6.celery beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler

directory=/home/myproj/iotv6


user=root


numprocs=1


stdout_logfile=/var/log/celery/iotv6_beat.log


stderr_logfile=/var/log/celery/iotv6_beat.log


autostart=true


autorestart=true


startsecs=10


stopwaitsecs = 600


killasgroup=true


priority=999


iot_worker.conf dosyası:


[program:iotv6_worker]


command=/home/myproj/venvpy3/bin/celery -A iotv6.celery worker -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler

directory=/home/myproj/iotv6


user=root


numprocs=1


stdout_logfile=/var/log/celery/iotv6_worker.log


stderr_logfile=/var/log/celery/iotv6_worker.log


autostart=true


autorestart=true


startsecs=10


stopwaitsecs = 600


killasgroup=true


priority=999


9- Django uygulamamızı restart yapıyoruz. Biz uwsgi kullanıyoruz.

sudo systemctl restart uwsgi


10- supervisorctl i update ediyoruz.

sudo supervisorctl reread

sudo supervisorctl update


Bu işlemlerden sonra django celery Scheduled Tasks in sorunsuz olarak çalışması gerekiyor. Şimdi Django admin panele girerek task in zamanlamasını oluşturalım.










Hepsi bu kadar iyi çalışmalar.