Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Celery

Celery

Celery কি ? কিভাবে কাজ করে ?

Celery কি

Django ডিফল্ট ভাবে একসাথে একটি টাস্ক চালাতে পারে কিন্তু যদি আমরা একের অধিক টাস্ক দিতে চাই তাহলে আমরা Django এর জন্য celery ব্যবহার করবো আরো সহজ ভাবে বলতে গেলে যদি একের অধিক টাস্ক একটা একটা করে ব্যাকএন্ড এ কাজ শেষে ফ্রন্টএন্ড এ রেজাল্ট হিসাবে পাঠিয়ে দেয়।

celery নিয়ে কাজ করার জন্য আমাদের কয়েকটি জিনিস সম্পর্কে জানতে হবে

  • CELERY_RESULT_BACKEND
  • django-celery-results
  • CELERY_BROKER_URL
  • django-celery-beat

CELERY_RESULT_BACKEND : সংক্ষেপে বললে যে টাস্ক গুলো করতে দেব ঐগুলো সাকসেস ও ফেল দেখার জন্য

django-celery-results & CELERY_BROKER_URL: ডেটাবেজ থেকে দেখবো বা অন্য কোন স্টোরেজ ব্যবহার করবো তা হলো।

django-celery-beat : যদি টাস্ক গুলো নির্দিষ্ট সময়ে চালাতে হয় তাহলে ব্যবহার হয়।

রেজাল্ট ব্যাকএন্ড Result Backend

টাস্ক গুলো যে ব্যাকএন্ড এ চলেছে এইগুলো পরবর্তীতে আমাদের দরকার হতে পারে যে কয়টা সফল কয়টা ফেল বা এ জাতীয় টাস্ক সম্পর্কে পরবর্তীতে জানার জন্য ব্যাকএন্ড এ রেজাল্ট গুলো সেভ করা যায়। যদি না করি তাহলে পরবর্তীতে তাহলে Celery results সংরক্ষণ করা হবে না। এটি একটি সমস্যা হতে পারে যদি আপনি results কে অ্যাক্সেস করতে চান।

django-celery-results এবং CELERY_RESULT_BACKEND

django-celery-results একটি Django extension যা Django ORM ব্যবহার করে Celery results সংরক্ষণ করে। এটি Celery result backend হিসাবে Database backend ব্যবহার করে।

CELERY_RESULT_BACKEND একটি Celery setting যা Celery result backend নির্দিষ্ট করে। এটি যেকোনো ধরণের Celery result backend ব্যবহার করতে পারে, যেমন RPC backend, Redis backend, বা Database backend।

তাহলে, দুইটাই ব্যবহার করতে হবে না। আপনি যেকোনো একটা ব্যবহার করতে পারেন।

django-celery-results ব্যবহার করার সুবিধা:

  • Django ORM ব্যবহার করে results সংরক্ষণ করা সহজ: django-celery-results ব্যবহার করে, আপনি results সংরক্ষণ করতে Django ORM ব্যবহার করতে পারেন। এটি results সংরক্ষণ করাকে আরও সহজ করে তোলে।
  • results কে Django models হিসাবে অ্যাক্সেস করা যায়: django-celery-results ব্যবহার করে, আপনি results কে Django models হিসাবে অ্যাক্সেস করতে পারেন। এটি results অ্যাক্সেস করাকে আরও সহজ করে তোলে।

CELERY_RESULT_BACKEND ব্যবহার করার সুবিধা:

  • যেকোনো ধরণের Celery result backend ব্যবহার করা যায়: CELERY_RESULT_BACKEND ব্যবহার করে, আপনি যেকোনো ধরণের Celery result backend ব্যবহার করতে পারেন। এটি আপনাকে আপনার চাহিদা অনুসারে Celery result backend নির্বাচন করার সুযোগ দেয়।
  • Celery result backend কে কনফিগার করা সহজ: CELERY_RESULT_BACKEND ব্যবহার করে, আপনি Celery result backend কে সহজেই কনফিগার করতে পারেন।

CELERY_RESULT_BACKEND ব্যবহার না করলে কী হবে:

আপনি যদি django-celery-results বা CELERY_RESULT_BACKEND ব্যবহার না করেন তাহলে Celery results সংরক্ষণ করা হবে না। এটি একটি সমস্যা হতে পারে যদি আপনি results কে অ্যাক্সেস করতে চান।

CELERY_BROKER_URL

সেলেরি_ব্রোকার_ইউআরএল অপশনটি সেলেরি কাস্টম ব্রোকার ইউআরএল বর্ণনা করে। সেলেরি একটি টাস্ক কিউ ম্যানেজমেন্ট সিস্টেম যা টাস্কগুলিকে তাদের সম্পূর্ণ করার জন্য ওয়ার্কারগুলিতে পাঠায়। ব্রোকার সেই সার্ভার যেখানে টাস্কগুলি স্টোর করা হয় এবং ওয়ার্কারগুলিকে পাঠানো হয়।

django-celery-beat


django-celery-beat হল একটি Django extension যা Celery periodic tasks চালানোর জন্য। Celery periodic tasks হল এমন tasks যা নির্দিষ্ট সময়সূচীতে চালানো হয়।

django-celery-beat ব্যবহার করার জন্য কিছু সাধারণ উদাহরণ হল:

  • ইমেল পাঠানো: আপনি django-celery-beat ব্যবহার করে প্রতিদিন সকালে একটি ইমেল পাঠাতে পারেন।
  • ডেটা ব্যাকআপ নেওয়া: আপনি django-celery-beat ব্যবহার করে প্রতি সপ্তাহে একটি ডেটা ব্যাকআপ নিতে পারেন।
  • সফ্টওয়্যার আপডেট করা: আপনি django-celery-beat ব্যবহার করে প্রতি মাসে একটি সফ্টওয়্যার আপডেট করতে পারেন।

পরবর্তী টিউটোরিয়ালে আমরা celery নিয়ে কাজ করবো

install celery

Install Celery

Celery Install করতে নিচের কমান্ডটি ব্যবহার করুন:

pip install celery

একটা মডার্ন Django এপ্লিকেশন এর ফোল্ডার স্ট্রাকচার দেখতে নিচের মতো হয়

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

Configure Celery

নতুন একটি celery ইনস্ট্যান্স বানাতে হবে একটি ফাইল তৈরী করি  proj/proj/celery.py

import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django apps.
app.autodiscover_tasks()


@app.task(bind=True, ignore_result=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

proj এর জায়গায় আমাদের প্রজেক্ট এর নাম হবে

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

init.py ফাইলে ফাইল টি অ্যাড করতে হবে

# 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',)

রেজাল্ট ব্যাকএন্ড সেটআপ

যদি রেজাল্ট ডেটাবেজ এ সেভ করতে চাই

pip install django-celery-results

Configure Django settings for Celery Results settings.py

# settings.py

INSTALLED_APPS = [
    'django_celery_results',
]
# Celery configuration
CELERY_RESULT_BACKEND = 'django-db'

যদি রেজাল্ট Redis এ সেভ করতে চাই

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

Redis as broker

download redis and install in windows or your operating system

pip install --upgrade redis
# Celery configuration
CELERY_BROKER_URL = 'redis://localhost:6379/0'  # Use the URL of your message broker (e.g., Redis)

Apply migrations

python manage.py migrate

celery task

আমরা যে টাস্ক গুলো করতে দেব ওই গুলো হলো টাস্ক। আমাদের এপ্লিকেশন এর ফোল্ডারে tasks.py বা workers.py বা যেকোন নামে ফাইল বানিয়ে আমরা টাস্ক গুলো ওই ফাইলে লিখতে পারি এবং পরবর্তীতে views.py তে ব্যবহার করবো এবং কোনো একটা মেথডে টাস্ক কে কল করবো।

Create a Celery Task

In one of your Django apps, create a file named tasks.py and define a simple Celery task:

# tasks.py

from celery import shared_task
@shared_task
def test_task():
    for i in range(1,10):
        print(f"Number: {i}")

Use Celery Task in a Django View

# views.py

from .tasks import test_task
def test(request):
    result = test_task.delay()
    return HttpResponse("done")

Create a urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('test/', views.test, name='test'),    
]

Run Celery

need separated run below command

celery -A project_name worker -l info 

Celery Beat

use for run a schedule time automatically

pip django-celery-beat

INSTALLED_APPS = [
    ...
    'django_celery_beat',
]


Migrate Database

python manage.py migrate

#settings.py

#Configure Celery Beat Scheduler:
CELERY_BEAT_SCHEDULE = {
    'my_task': {
        'task': 'myapp.tasks.my_task',
        'schedule': 300.0,  # Run every 5 minutes (300 seconds)
    },
}

# Configure Celery Beat Settings:
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
CELERY_BEAT_LOG_LEVEL = 'INFO'

To start Celery Beat, you can run the following command:

celery -A myproject worker -l info -B

Example

from celery import shared_task
@shared_task
def test_task():
    for i in range(1,10):
        print(f"Number: {i}")

#settings.py
CELERY_BEAT_SCHEDULE = {
    'test_task': {
        'task': 'tasks.test_task',
        'schedule': 300.0,  # Run every 5 minutes (300 seconds)
    },
}

we can use schedule in celery.py

#Celery Beat Settings  
app.conf.beat_schedule = {  
    'send-mail-every-day-at-8' :  {  
        'task': 'emailExample.tasks.send_mail_func',  
        'schedule': crontab(hour = 15, minute = 42),  
  
    }  
      
}  

প্রাকটিক্যাল করি

একটি Django প্রজেক্ট ও একটি এপ্লিকেশন বানাই

Create a Django Project:

django-admin startproject project_name

Navigate to the Project Directory:

cd project_name

Create a Django App:

python manage.py startapp app_name

setings.py

INSTALLED_APPS = [
  'app_name',

]

python manage.py migrate 

app_name/views.py

# app_name/views.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello from my view!")

app_name/urls.py

# app_name/urls.py

from django.urls import path

from . import views

urlpatterns = [

path('', views.index, name='index'),

]

project urls.py

# project_name/urls.py

from django.contrib import admin

from django.urls import path, include # Import the include function

urlpatterns = [

path('admin/', admin.site.urls),

path('', include('app_name.urls')), # Include the app's URLs

]

Start the Development Server To Check

python manage.py runserver

celery Configure

রেডিস ইনস্টল করি

এই লিংক থেকে রেডিস ডাউনলোড করে ইনস্টল করি link

প্রয়োজনীয় লাইব্রেরি ইনস্টল করি

pip install  celery redis django-celery-results django-celery-beat

Settings.py

INSTALLED_APPS = [
   'django_celery_results',
   'django_celery_beat'

]

python manage.py migrate 

প্রজেক্ট ডিরেক্টরির যেখানে settings.py ফাইল আছে সেখানে celery.py নামে একটি ফাইল তৈরী করি।

from __future__ import absolute_import, unicode_literals
import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')

app = Celery('project_name')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django apps.
app.autodiscover_tasks()


@app.task(bind=True, ignore_result=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

প্রজেক্ট এর settings.py ডিরেক্টরি তে init.py তে celery যোগ করি

from .celery import app as celery_app

__all__ = ('celery_app',) 

setings.py



# Celery settings
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True

app ফোল্ডারে tasks.py নামে একটি ফাইল তৈরী করি

# app_name/tasks.py


from celery import shared_task
import time

@shared_task
def print_numbers():
    for i in range(1, 11):
        print(f"Number: {i}")
        time.sleep(1)  # Sleep for 1 second between each print


    

app ফোল্ডারে views.py নামে ফাইলটি নিচের মত করি

from django.shortcuts import render
from django.http import HttpResponse  # Import HttpResponse

from .tasks import print_numbers


def print_numbers_view(request):
    # Use Celery task to print numbers asynchronously
    print_numbers.delay()

    return HttpResponse  ('email_sent.html')

urls.py


from django.urls import path

from . import views

urlpatterns = [

path('', views.print_numbers_view, name='print_numbers_view'),

]

Celery Beat Schedule

CELERY_BEAT_SCHEDULE = {
    'print_numbers': {
        'task': 'app_name.tasks.print_numbers',
        'schedule': 300.0,  # Run every 5 minutes (300 seconds)
    },
}

প্রজেক্ট ফোল্ডারে cmd ওপেন করে নিচের কমান্ড রান করি

celery -A project_name worker -l info 
celery -A project_name beat -l info

Articles

How can we help?