পটভূমি তাই আজ, আমি নামের একটি সেলারি বিকল্প সম্পর্কে কথা বলব, যেটি তুলনায় অনেক সহজ সেটআপের সাথে আসে এবং সেলেরির তুলনায় আকারে অনেক ছোট। Huey সেলেরির আমি কেন Huey চেষ্টা করার সিদ্ধান্ত নিয়েছি কারণ ডকুমেন্টেশন খুব বেশি না হওয়ায় কিছু সাধারণ কাজ করার জন্য মাঝে মাঝে সেলেরির সাথে কিছু সমস্যার সম্মুখীন হয়েছি। যারা সেলেরি কী তা জানেন না বা আগে এটি ব্যবহার করেননি তাদের জন্য, Huey হল একটি অ্যাসিঙ্ক্রোনাস টাস্ক কিউ যা আপনাকে ব্যাকগ্রাউন্ডে নির্ধারিত কাজ বা দীর্ঘ-চলমান কাজগুলি সম্পাদন করতে দেয়। পূর্বশর্ত আমরা নিম্নলিখিত প্যাকেজগুলি ইনস্টল করব: redis জ্যাঙ্গো হুই অনুরোধ (ঐচ্ছিক, ডেমোর জন্য প্রয়োজন) গিটহাব রেপো নিম্নলিখিত ব্লগটি একটি GitHub রেপো সহ আসে যা আপনি ডেমো প্রকল্পটি পরীক্ষা করতে ব্যবহার করতে পারেন যা আমরা তৈরি করব। রেপো দেখতে এখানে ক্লিক করুন. প্রকল্প সেটআপ প্রজেক্ট ডিরেক্টরি তৈরি করুন টার্মিনাল খুলুন, এবং একটি ডিরেক্টরি তৈরি করতে নিম্নলিখিত টাইপ করুন; আপনি এই ধাপটি এড়িয়ে যেতে পারেন এবং ফাইল এক্সপ্লোরার থেকেই এটি করতে পারেন। mkdir huey_demo ভার্চুয়াল পরিবেশ আমাদের প্রকল্প নির্ভরতা ইনস্টল করার জন্য প্রথমে একটি ভার্চুয়ালেনভ তৈরি করা যাক: python -m venv venv ভার্চুয়ালেনভ (লিনাক্স) সক্রিয় করুন: source venv/bin/activate নির্ভরতা ইনস্টল করা সমস্ত নির্ভরতা ইনস্টল করতে টার্মিনালে নিম্নলিখিত কমান্ডটি টাইপ করুন: pip install Django==4.0.4 redis==4.2.2 huey==2.4.3 এই নিবন্ধটি লেখার সময়, এই সংস্করণগুলি আমি এই সেটআপটি পরীক্ষা করেছিলাম, ভবিষ্যতে সর্বশেষ সংস্করণ অনুসারে যে কোনও আপডেটের জন্য গিথুব রেপোতে নজর রাখুন। প্রকল্পটি তৈরি করুন টার্মিনালে নিম্নলিখিত কমান্ডটি টাইপ করে জ্যাঙ্গো প্রকল্পটি তৈরি করুন: django-admin startproject django_huey_demo Django প্রকল্প ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করুন: cd django_huey_demo আমাদের প্রকল্পের অধীনে অ্যাপ তৈরি করুন: python manage.py startapp demo প্রজেক্ট এ তৈরি অ্যাপটি অন্তর্ভুক্ত করুন, নিম্নলিখিত পরিবর্তনগুলি করুন: settings.py INSTALLED_APPS = [ # Existing Apps "demo.apps.DemoConfig", # <== Add this line ] এ ডিবাগ মোড এ সেট করুন: settings.py False DEBUG=False আমরা ডিবাগকে ফলসে সেট করছি যাতে আমরা দেখতে পারি Huey কীভাবে প্রোডাকশনে চলে, এই বিষয়ে পরে আরও। প্রজেক্ট সারসংক্ষেপ এখন যেহেতু আমরা আমাদের প্রজেক্ট সেট আপ করে ফেলেছি, আজকে আমরা কী তৈরি করব তা আপনাকে নেওয়ার জন্য এটি একটি ভাল সময়। আমরা থেকে প্রতিদিন "Word of the Day" আনব। তারপর আমরা আমাদের ডাটাবেসে একটি বাক্যে শব্দ, এর সংজ্ঞা এবং শব্দের উদাহরণ সংরক্ষণ করব। Wordnik API আমরা Huey ব্যবহার করে একটি পর্যায়ক্রমিক কাজ সেট আপ করব যা দিনের শব্দটি আনবে এবং এটি সংরক্ষণ করবে। শব্দটি সংরক্ষণ করার জন্য আমরা এর একটি জ্যাঙ্গো মডেল তৈরি করব। Wordnik API কী পাচ্ছেন আপনি API কী পেতে অনুসরণ করতে পারেন। এই নির্দেশিকা আমাদের প্রকল্প কোডিং আমাদের প্রকল্পে Huey যোগ করুন আমাদের প্রকল্পের ইনস্টল করা অ্যাপগুলিতে Huey যোগ করতে হবে, তাই ফাইলে নিম্নলিখিত পরিবর্তনগুলি করুন: settings.py INSTALLED_APPS = [ # Existing apps 'huey.contrib.djhuey', # <== Add this line ] রেডিস ইনস্টল করুন সারিবদ্ধ কাজগুলি সম্পর্কে তথ্য সংরক্ষণ করার জন্য আমাদের Huey-এর জন্য Redis ইনস্টল করতে হবে যেমনটি আমরা সেলারিতেও করতাম। আপনার নির্দিষ্ট অপারেটিং সিস্টেমের উপর ভিত্তি করে রেডিস ইনস্টল করতে আপনি নিম্নলিখিত উল্লেখ করতে পারেন। লিঙ্কটি আপনি যদি ডকার ব্যবহারে স্বাচ্ছন্দ্য বোধ করেন তবে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন: docker run --name redis_huey -p 6379:6379 -d redis ডিফল্টরূপে, Huey এ চলমান Redis সার্ভারের সাথে সংযোগ করার চেষ্টা করবে। এটি উপস্থিত না থাকলে, এটি একটি ত্রুটি বাড়াবে৷ localhost:6379 মডেল সংজ্ঞা আপনার ফাইলে নিম্নলিখিত কোড যোগ করুন: demo/models.py from django.db import models class Word(models.Model): word = models.CharField(max_length=200) part_of_speech = models.CharField(max_length=100) definition = models.TextField() example = models.TextField() def __str__(self): return self.word মাইগ্রেশন করুন: python manage.py makemigrations demo মাইগ্রেশন প্রয়োগ করুন: python manage.py migrate demo টাস্ক সংজ্ঞা ডেমো অ্যাপ ডিরেক্টরিতে নামে একটি ফাইল তৈরি করুন। আমরা কেন আমাদের ফাইলের নাম রাখি তা হল আমাদের নিবন্ধিত অ্যাপগুলিতে উপস্থিত কাজগুলিকে স্বয়ংক্রিয়ভাবে আবিষ্কার করতে সাহায্য করার জন্য, যদি আমরা আমাদের ফাইলের নাম তা ছাড়া অন্য কিছু রাখি তবে আমাদের কাজটি ম্যানুয়ালি নিবন্ধন করতে হবে। আপনি যদি আরও জানতে চান তবে আপনি Huey ডকুমেন্টেশন দেখতে পারেন। tasks.py tasks.py এখানে আমরা টাস্ক সংজ্ঞা লিখার আগে, আমাদের একটি অতিরিক্ত নির্ভরতা ইনস্টল করতে হবে। আপনার টার্মিনালে নিম্নলিখিত টাইপ করে এটি ইনস্টল করুন: requests pip install requests==2.27.1 এখন, কোড আসে: import requests from django.conf import settings from huey import crontab from huey.contrib.djhuey import db_periodic_task from demo.models import Word @db_periodic_task(crontab(hour="18", minute="00")) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] ) আপনার প্রকল্প সেটিংসে নিম্নলিখিত লাইন যোগ করুন: WORDNIK_API_KEY = "api-key-here" এই কোড ব্লকটি নেওয়ার জন্য অনেক কিছু হতে পারে, তাই আসুন একে একে একে একে একে একে একে একে একে একে দেখি: হুই ডেকোরেটর from huey.contrib.djhuey import db_periodic_task এটি ডাটাবেসের সাথে কাজ করা জড়িত পর্যায়ক্রমিক কাজগুলি নিবন্ধন করার জন্য Huey দ্বারা সরবরাহ করা একটি ডেকোরেটর, এই ডেকোরেটর টাস্ক সম্পূর্ণ হওয়ার পরে স্বয়ংক্রিয়ভাবে ডাটাবেস সংযোগ বন্ধ করে দেয়, আরও বিশদ বিবরণের জন্য, আপনি এখানে উল্লেখ করতে পারেন। ক্রন্টাব সময়সূচী @db_periodic_task(crontab(hour="18", minute="00")) আমরা আর্গুমেন্ট আমাদের পর্যায়ক্রমিক টাস্ক ডেকোরেটরের কাছে পাঠাচ্ছি, এটি Huey কে প্রতিদিন সন্ধ্যা 6 টায় আমাদের টাস্ক চালাতে বলে। আপনি আপনার ক্রন্টাব সময়সূচী তৈরি করতে ব্যবহার করতে পারেন, আমি প্রতিবার এটি ব্যবহার করি। crontab(hour="18", minute="00") এই ওয়েবসাইটটি Wordnik API কী from django.conf import settings # Usage ## settings.WORDNIK_API_KEY হল আমাদের প্রজেক্ট সেটিংস থেকে যেকোনো ডেটা আমদানি করার আদর্শ উপায়, এটি এমন ক্ষেত্রে দরকারী যেখানে আমাদের বিভিন্ন পরিবেশের জন্য একাধিক সেটিংস ফাইল সেট আপ করা আছে তাই এটি আমাদের চিন্তা না করেই বুঝতে পারবে কোন ফাইল থেকে বাছাই করা হবে এটা এটি এনভায়রনমেন্ট ভেরিয়েবল থেকে আমরা কোন সেটিংস ফাইল ব্যবহার করছি তা খুঁজে বের করে। কিন্তু আপনি এই বিবরণ সম্পর্কে চিন্তা করতে হবে না. from django.conf import settings DJANGO_SETTINGS_MODULE তারপর আমরা আমাদের Wordnik API কলে কী ব্যবহার করি। Wordnik API কল r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") এখানে, আমরা প্রমাণীকরণের জন্য আমাদের API কী পাস করার সময় Wordnik API-তে একটি GET অনুরোধ করতে অনুরোধ মডিউল ব্যবহার করছি। ডাটাবেসে শব্দ সংরক্ষণ করা data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] ) API প্রতিক্রিয়া পার্স করার পরে, আমরা আমাদের ডাটাবেসে শব্দ সংজ্ঞা সংরক্ষণ করছি। আমরা এখানে পদ্ধতির পরিবর্তে পদ্ধতি ব্যবহার করছি যাতে Wordnik API দ্বারা সেই শব্দটি পুনরাবৃত্তি হলে আমরা আমাদের ডাটাবেসে একই শব্দের একাধিক কপি তৈরি করতে না পারি। create get_or_create Wordnik API প্রতিক্রিয়া ওয়ার্ড অফ দ্য ডে এন্ডপয়েন্টের জন্য Wordnik API প্রতিক্রিয়া কেমন দেখায় তা এখানে। প্রতিক্রিয়ার কিছু অপ্রাসঙ্গিক অংশ সংক্ষিপ্ততার উদ্দেশ্যে ছাঁটাই করা হয়েছে। { "word": "stolon", "definitions": [ { "source": "ahd-5", "text": "A long thin stem that usually grows horizontally along the ground and produces roots and shoots at widely spaced nodes, as in a strawberry plant.", "note": null, "partOfSpeech": "noun" }, // More definitions here... ], "publishDate": "2022-05-08T03:00:00.000Z", "examples": [ { "title": "4.1 Nursery establishment", "text": "A stolon is a stem that grows along the ground, producing at its nodes new plants with roots and upright stems.", // Additional data here... }, // More examples here... ], // Additional fields here... } হুই ওয়ার্কার চলছে আপনি আপনার টার্মিনালে নিম্নলিখিত কমান্ড টাইপ করে Huey কর্মী শুরু করতে পারেন: python manage.py run_huey আপনি উপরের কমান্ডে একাধিক পতাকা পাস করতে পারেন যা কনসোলে লগ ইন করা পরিবর্তন করবে, যেমন: - verbose লগিং (DEBUG স্তর অন্তর্ভুক্ত) -v, --verbose - ন্যূনতম লগিং -q, --quiet - সহজ লগিং বিন্যাস ("সময় বার্তা") -S, --simple লগিং করার জন্য অন্যান্য বিভিন্ন বিকল্প দেখতে, ডক্স দেখুন। এখানে আপনি Huey সঙ্গে আর কি করতে পারেন? টাস্ক ডেকোরেটর আপনি টাস্কের মধ্যে কোন অপারেশন করছেন তার উপর নির্ভর করে Huey একাধিক টাস্ক ডেকোরেটর নিয়ে আসে। আমি নীচে সংক্ষিপ্তভাবে ব্যাখ্যা করব যে সেগুলি কী করে। এখানে সমস্ত ডেকোরেটরের জন্য আমদানি বিবৃতি রয়েছে: from huey.contrib.djhuey import task, periodic_task, db_task, db_periodic_task : একটি নিয়মিত কাজ। task : যখন আপনি সময়সূচীর উপর ভিত্তি করে পর্যায়ক্রমে একটি টাস্ক চালাতে চান। periodic_task : যখন আপনি আপনার টাস্কের মধ্যে DB অপারেশন করতে চান। db_task : যখন আপনি একটি পর্যায়ক্রমিক টাস্কে DB অপারেশন করতে চান। db_periodic_task ক্রন্টাব উদাহরণ আমি আপনাকে আরও কিছু উদাহরণ দেখাই কিভাবে আপনি আপনার কাজের সময়সূচী করতে ক্রন্টাব ব্যবহার করতে পারেন। টাস্কটি প্রতি তিন মিনিটে চালানোর জন্য নির্ধারিত করবে। crontab(minute='*/3') একটি টাস্ক তৈরি করবে যা প্রতি তৃতীয় ঘণ্টায় 5 মিনিটে চলবে। crontab(hour='*/3', minute='5') একটি টাস্ক তৈরি করবে যা সপ্তাহের প্রতি ৫ম দিনে, প্রতি ২য় মাসের এই সময়ে চলবে সকাল 10.00 টা. crontab(minute='00', hour='10', month='*/2', day_of_week='*/5') কর্ম নির্ধারণ উদাহরণস্বরূপ, আপনি নিম্নলিখিত টাস্কটি ভিতরে সংজ্ঞায়িত করেছেন: tasks.py from huey.contrib.djhuey import task @task() def count(): for i in range(10): print(i) এখন, আপনি যদি এই টাস্কটিকে কল করতে চান কিন্তু এটি 5 সেকেন্ড পরে চলতে চান তবে আপনি নিম্নলিখিতগুলি করতে পারেন: count.schedule(delay=5) পরামিতি সেকেন্ডে মান নেয়, তাই আপনি যদি এটি 5 মিনিটের পরে কার্যকর করতে চান তবে 300 সেকেন্ড নির্দিষ্ট করুন। delay ব্যর্থ হওয়া টাস্কগুলি পুনরায় চেষ্টা করা ধরুন আপনি আমাদের বিদ্যমান টাস্কে নিম্নলিখিত যুক্তি যোগ করেছেন: @db_periodic_task(crontab(hour="18", minute="00"), retries=2) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") if r.status_code != 200: raise Exception("Unable to fetch data from Wordnik API") ## Add this logic else: data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] ) সুতরাং, আমরা প্রতিক্রিয়ার স্ট্যাটাস কোড পরীক্ষা করার জন্য যুক্তি যোগ করেছি, এবং যদি এটি 200 ব্যতীত অন্য কিছু হয় তবে এটি 2 বার পর্যন্ত সেই কাজটি পুনরায় চেষ্টা করবে। কিন্তু এই পুনঃপ্রচার দুটি প্রচেষ্টার মধ্যে কোনো সময়ের ব্যবধান ছাড়াই ঘটবে। এখন, আপনি যদি এই কাজের একাধিক প্রচেষ্টা বিলম্বিত করতে চান? আমরা আর্গুমেন্ট পাস করে তা করতে পারি, এটি সেকেন্ডের মধ্যে মান গ্রহণ করে। retry_delay @db_periodic_task(crontab(hour="18", minute="00"), retries=2, retry_delay=10) এটি একাধিক প্রচেষ্টার মধ্যে 10-সেকেন্ড বিলম্বের কারণ হবে৷ উন্নয়ন মোড Huey একটি ডিফল্ট সেটিং সহ আসে যা জ্যাঙ্গোতে বিকাশের সময় Huey এর সাথে কাজ করা সহজ করে তোলে। সুতরাং, যখনই আপনার ফাইলে উপস্থিত থাকবে, কাজগুলি নিয়মিত ফাংশন কলের মতোই সিঙ্ক্রোনাসভাবে চালানো হবে। এর উদ্দেশ্য হল পরীক্ষা তৈরি বা চালানোর সময় Redis এবং একটি অতিরিক্ত ভোক্তা প্রক্রিয়া উভয়ই চালানো এড়ানো। আপনি এই বিষয়ে আরও পড়তে পারেন . settings.py DEBUG=True এখানে এর জন্য, আমাদের এ নিম্নলিখিত লাইন যোগ করতে হবে: settings.py HUEY = {} যাইহোক, আপনি যদি এই আচরণটি ওভাররাইড করতে চান তবে আপনি পরিবর্তে নিম্নলিখিত Huey কনফিগারেশন যোগ করতে পারেন: HUEY = { "immediate": False } থাকাকালীন আপনার যদি এ উল্লিখিত উপরের কনফিগারেশন থাকে, Huey-এর জন্য আপনাকে Redis সেট আপ করতে হবে এবং কমান্ড ব্যবহার করে Huey ওয়ার্কার চালাতে হবে। DEBUG=True settings.py run_huey সেলারি বনাম হুই সেলারি তুলনায় Huey সম্পর্কে কিছু পর্যবেক্ষণ হল: সেলেরির তুলনায় নির্ভরতার ছোট পদচিহ্ন। সেলারি এটির সাথে কম্বু এবং বিলিয়ার্ড ইনস্টল করে। এদিকে, Huey এর কোন নির্ভরতা নেই। পর্যায়ক্রমিক কাজগুলির জন্য কম পরিষেবাগুলি চালানো দরকার, সেলারির জন্য পর্যায়ক্রমিক কাজগুলির সাথে কাজ করার জন্য চলমান বীট পরিষেবা এবং একজন কর্মী পরিষেবার প্রয়োজন এই সময়ে আমাদের কমান্ড ব্যবহার করে শুধুমাত্র একটি পরিষেবা চালাতে হবে। run_huey তথ্যসূত্র হুই ডক্স Wordnik API অ্যাসোসিয়েটেড গিথুব রেপো