Flask অ্যাপ্লিকেশনগুলি সাধারণত ওয়েব রিকোয়েস্টের উপর ভিত্তি করে কাজ করে। কিন্তু কিছু কাজ রয়েছে যা সময় নেয়, যেমন বড় ডেটাবেস অপারেশন, ফাইল প্রসেসিং, অথবা তৃতীয় পক্ষের সেবা (API) থেকে তথ্য সংগ্রহ। এই ধরনের কাজগুলি সাধারণত সিঙ্ক্রোনাসভাবে (একই থ্রেডে) চলে, যার ফলে ব্যবহারকারীর রিকোয়েস্ট প্রতিস্থাপিত হতে পারে এবং অ্যাপ্লিকেশনের পারফরম্যান্স খারাপ হতে পারে।
এক্ষেত্রে Background Tasks এবং Delayed Execution একটি কার্যকরী সমাধান হতে পারে। Flask-এ এই ধরনের কাজ পরিচালনা করতে কয়েকটি পদ্ধতি রয়েছে, যেমন Celery বা Flask-Executor। এখানে আমরা Celery ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক এবং দেরি করা এক্সিকিউশন (Delayed Execution) দেখব।
১. Flask-এ Background Task: Celery ব্যবহার করা
Celery হলো একটি জনপ্রিয় পাইথন লাইব্রেরি, যা Flask অ্যাপ্লিকেশনের জন্য ব্যাকগ্রাউন্ড টাস্ক এবং প্যারালাল প্রসেসিং পরিচালনা করতে ব্যবহৃত হয়। এটি দীর্ঘ-running কাজগুলি ব্যাকগ্রাউন্ডে পরিচালনা করে, যাতে মূল অ্যাপ্লিকেশন থ্রেড ব্লক না হয়।
ধাপ ১: Celery ইনস্টলেশন
প্রথমে Celery ইনস্টল করতে হবে:
pip install celery
ধাপ ২: Flask অ্যাপে Celery সেটআপ
Flask অ্যাপ্লিকেশন এবং Celery ইন্টিগ্রেট করতে নিচের কোড ব্যবহার করুন:
from flask import Flask, jsonify
from celery import Celery
# Flask অ্যাপ সেটআপ
app = Flask(__name__)
# Celery কনফিগারেশন
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0' # Redis ব্যবহার করে ব্রোকার URL
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0' # Redis ব্যবহার করে রেজাল্ট ব্যাকএন্ড
# Celery ইনিশিয়ালাইজ করা
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
# ব্যাকগ্রাউন্ড টাস্ক
@celery.task
def long_task():
import time
time.sleep(10) # ১০ সেকেন্ড স্লিপ (লং রানিং কাজের উদাহরণ)
return 'Task Completed!'
@app.route('/start_task', methods=['GET'])
def start_task():
# ব্যাকগ্রাউন্ড টাস্ক শুরু করা
task = long_task.apply_async() # টাস্ক অ্যাসিঙ্ক্রোনাসভাবে শুরু
return jsonify({"task_id": task.id}), 202 # টাস্ক আইডি ফেরত
@app.route('/task_status/<task_id>', methods=['GET'])
def task_status(task_id):
task = long_task.AsyncResult(task_id) # টাস্কের স্ট্যাটাস চেক
if task.state == 'PENDING':
return jsonify({"status": "Task is still pending"}), 200
elif task.state == 'SUCCESS':
return jsonify({"status": "Task completed!", "result": task.result}), 200
elif task.state == 'FAILURE':
return jsonify({"status": "Task failed"}), 500
else:
return jsonify({"status": "Unknown"}), 500
if __name__ == "__main__":
app.run(debug=True)
এখানে:
CELERY_BROKER_URL: Redis সার্ভার URL যেখানে Celery টাস্কগুলো ব্রোকার হিসাবে কাজ করবে।long_task: একটি ব্যাকগ্রাউন্ড টাস্ক, যা ১০ সেকেন্ড স্লিপ করে পরে "Task Completed!" বার্তা ফেরত দেয়।apply_async(): এটি Celery টাস্ককে অ্যাসিঙ্ক্রোনাসভাবে চালু করে।AsyncResult(): এটি টাস্কের স্ট্যাটাস এবং ফলাফল চেক করতে ব্যবহৃত হয়।
২. Celery Worker চালানো
Celery অ্যাপ চালানোর জন্য আপনাকে Celery Worker চালাতে হবে। এটি ব্যাকগ্রাউন্ড টাস্ক পরিচালনা করবে। নিচের কমান্ড ব্যবহার করে Celery Worker চালাতে হবে:
celery -A your_flask_app_name.celery worker --loglevel=info
এখানে:
your_flask_app_name: Flask অ্যাপের ফাইলের নাম।--loglevel=info: Celery Worker এর লগ লেভেল।
৩. Flask-এ Background Task Testing
Flask অ্যাপ চালানোর পর, http://127.0.0.1:5000/start_task URL এ গিয়ে একটি ব্যাকগ্রাউন্ড টাস্ক শুরু করতে পারেন। টাস্কের স্ট্যাটাস জানতে /task_status/<task_id> রাউটটি ব্যবহার করুন।
/start_task: ব্যাকগ্রাউন্ড টাস্ক শুরু করবে এবং একটি টাস্ক আইডি ফেরত দেবে।/task_status/<task_id>: টাস্কের স্ট্যাটাস এবং ফলাফল চেক করবে।
৪. Flask Executor (Delayed Execution)
Flask-এ কিছু কাজ দেরিতে (Delayed Execution) সম্পন্ন করতে Flask-Executor ব্যবহার করা যেতে পারে। এটি একটি সাধারণ এবং দ্রুত পদ্ধতি যারা Celery ব্যবহার করতে চান না।
ধাপ ১: Flask-Executor ইনস্টল করা
pip install flask-executor
ধাপ ২: Flask-Executor সেটআপ
from flask import Flask
from flask_executor import Executor
import time
app = Flask(__name__)
# Executor সেটআপ
executor = Executor(app)
def long_task():
time.sleep(10) # লং রানিং কাজের উদাহরণ
print("Task Completed!")
@app.route('/start_task', methods=['GET'])
def start_task():
executor.submit(long_task) # ব্যাকগ্রাউন্ডে টাস্ক শুরু করা
return 'Task started in background!'
if __name__ == "__main__":
app.run(debug=True)
এখানে:
executor.submit(long_task): এটি ব্যাকগ্রাউন্ডে long_task() ফাংশন চালায়, যাতে ব্যবহারকারী রিকোয়েস্ট সেরে ফেলতে পারে এবং টাস্কটি আলাদা থ্রেডে চলে।
৫. Flask-এ Background Task এবং Delayed Execution এর সুবিধা
- ইউজার এক্সপেরিয়েন্স উন্নত: ব্যাকগ্রাউন্ড টাস্ক ব্যবহার করে ইউজারের ওয়েব রিকোয়েস্ট ব্লকিং রোধ করা যায়।
- রিসোর্স ব্যবস্থাপনা: বড় ও সময়সাপেক্ষ কাজগুলো ব্যাকগ্রাউন্ডে চলে, মূল অ্যাপ্লিকেশন দ্রুত কার্যক্রম সম্পন্ন করতে পারে।
- অ্যাপ্লিকেশন পারফরম্যান্স: Flask অ্যাপ্লিকেশনটি অধিক কার্যকরী হতে পারে যখন স্লো বা সময়সাপেক্ষ কাজগুলি আলাদা থ্রেডে চলে।
Background Tasks এবং Delayed Execution Flask অ্যাপ্লিকেশনে দীর্ঘ-running কাজ এবং প্রক্রিয়াগুলির কার্যকরী ব্যবস্থাপনা করতে সাহায্য করে। Flask-এ Celery ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক পরিচালনা করা যায়, অথবা সহজ পদ্ধতি হিসেবে Flask-Executor ব্যবহার করা যেতে পারে। এই ফিচারগুলো অ্যাপ্লিকেশন পারফরম্যান্স এবং ইউজার এক্সপেরিয়েন্স উন্নত করতে সহায়তা করে।