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.pyConfigure 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-resultsConfigure 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_nameNavigate to the Project Directory:
cd project_nameCreate 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-beatSettings.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