O yüzden bugün Kereviz'e göre çok daha kolay kurulumla gelen ve Kereviz'e göre boyutları çok daha küçük olan Huey isimli bir Kereviz alternatifinden bahsedeceğim.
Huey'i denemeye karar vermemin nedeni, bazen Kereviz ile bazı ortak görevleri yaparken bazı sorunlarla karşılaşmamdı çünkü dokümantasyon çok iyi değildi.
Kereviz'in ne olduğunu bilmeyen veya daha önce kullanmamış olanlar için Huey, arka planda zamanlanmış görevleri veya uzun süren görevleri gerçekleştirmenize olanak tanıyan eşzamansız bir görev kuyruğudur.
Aşağıdaki paketleri kuracağız:
Aşağıdaki blog, oluşturacağımız demo projesini test etmek için kullanabileceğiniz bir GitHub deposuyla birlikte geliyor.
Repo'yu görüntülemek için buraya tıklayın.
Terminali açın ve bir dizin oluşturmak için aşağıdakini yazın; bu adımı atlayabilir ve bunu Dosya Gezgini'nin kendisinden yapabilirsiniz.
mkdir huey_demo
Proje bağımlılıklarımızı kurmak için önce bir virtualenv oluşturalım:
python -m venv venv
Virtualenv'i etkinleştirin (Linux):
source venv/bin/activate
Tüm bağımlılıkları yüklemek için terminale aşağıdaki komutu yazın:
pip install Django==4.0.4 redis==4.2.2 huey==2.4.3
Bu makaleyi yazarken bunlar, bu kurulumu test ettiğim sürümlerdi; gelecekteki en son sürüme göre güncellemeler için Github Repo'yu takip edin.
Terminalde aşağıdaki komutu yazarak Django projesini oluşturun:
django-admin startproject django_huey_demo
Dizini Django proje dizinine değiştirin:
cd django_huey_demo
Projemiz kapsamında uygulamayı oluşturun:
python manage.py startapp demo
Oluşturulan uygulamayı settings.py
projesine ekleyin, aşağıdaki değişiklikleri yapın:
INSTALLED_APPS = [ # Existing Apps "demo.apps.DemoConfig", # <== Add this line ]
settings.py
dosyasında hata ayıklama modunu False
olarak ayarlayın:
DEBUG=False
Huey'in üretimde nasıl çalıştığını görebilmemiz için Debug'ı False'a ayarlıyoruz, bu konuya daha sonra değineceğiz.
Artık projemizi oluşturmayı bitirdiğimize göre, bugün inşa edeceğimiz şeyin sorumluluğunu size almanın tam zamanı.
Wordnik API'sinden günlük olarak "Günün Sözü"nü getireceğiz. Daha sonra kelimeyi, tanımını ve kelimenin cümle içindeki örneğini veri tabanımızda saklayacağız.
Huey'i kullanarak Günün Sözünü alıp saklayacak periyodik bir görev oluşturacağız.
Kelimeyi saklamak için aynı Django Modelini oluşturacağız.
API anahtarını almak için bu kılavuzu takip edebilirsiniz.
Projemizin yüklü uygulamalarına Huey'i eklememiz gerekiyor, bu yüzden settings.py
dosyasında aşağıdaki değişiklikleri yapın:
INSTALLED_APPS = [ # Existing apps 'huey.contrib.djhuey', # <== Add this line ]
Kereviz'de de yaptığımız gibi sıradaki görevlerle ilgili bilgileri depolamak için Redis for Huey'i kurmamız gerekiyor. Redis'i kendi işletim sisteminize göre yüklemek için aşağıdaki bağlantıya başvurabilirsiniz.
Docker'ı kullanmakta rahatsanız aşağıdaki komutu kullanabilirsiniz:
docker run --name redis_huey -p 6379:6379 -d redis
Huey varsayılan olarak localhost:6379
üzerinde çalışan Redis sunucusuna bağlanmayı deneyecektir. Eğer mevcut değilse, bir hata ortaya çıkaracaktır.
demo/models.py
dosyanıza aşağıdaki kodu ekleyin:
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
Geçişler yapın:
python manage.py makemigrations demo
Geçişleri uygula:
python manage.py migrate demo
Demo uygulama dizininde tasks.py
adlı bir dosya oluşturun. Dosyamıza tasks.py
adını vermemizin nedeni, Huey'in kayıtlı uygulamalarımızda mevcut olan görevleri otomatik olarak keşfetmesine yardımcı olmaktır; eğer dosyamıza bunun dışında bir ad verirsek, görevimizi manuel olarak kaydetmemiz gerekir. Daha fazla bilgi edinmek isterseniz buradan Huey belgelerine göz atabilirsiniz.
Görev tanımını yazmadan önce ek bir bağımlılık requests
yüklememiz gerekiyor. Terminalinize aşağıdakini yazarak yükleyin:
pip install requests==2.27.1
Şimdi kod geliyor:
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"] )
Proje ayarlarınıza aşağıdaki satırı ekleyin:
WORDNIK_API_KEY = "api-key-here"
Bu kod bloğunun anlaşılması çok fazla şey gerektirebilir, o yüzden hadi içindekileri tek tek gözden geçirelim:
Huey Dekoratör
from huey.contrib.djhuey import db_periodic_task
Bu, veritabanıyla çalışmayı içeren periyodik görevleri kaydetmek için Huey tarafından sağlanan bir dekoratördür, bu dekoratör, görev tamamlandıktan sonra veritabanı bağlantısını otomatik olarak kapatır, daha fazla ayrıntı için buraya başvurabilirsiniz.
Crontab Programı
@db_periodic_task(crontab(hour="18", minute="00"))
crontab(hour="18", minute="00")
argümanını periyodik görev dekoratörümüze iletiyoruz, bu Huey'e görevimizi her gün akşam 6'da çalıştırmasını söylüyor. Crontab programlarınızı oluşturmak için bu web sitesinden yararlanabilirsiniz, ben her zaman kullanıyorum.
Wordnik API Anahtarı
from django.conf import settings # Usage ## settings.WORDNIK_API_KEY
from django.conf import settings
proje ayarlarımızdaki herhangi bir veriyi içe aktarmanın standart yoludur; farklı ortamlar için ayarlanmış birden fazla ayar dosyamızın olduğu durumlarda kullanışlıdır, böylece bizim endişelenmemize gerek kalmadan hangi dosyadan seçileceğini bilir. BT. DJANGO_SETTINGS_MODULE
ortam değişkeninden hangi ayar dosyasını kullandığımızı bulur. Ancak bu ayrıntılar hakkında endişelenmenize gerek yok.
Daha sonra Wordnik API çağrımızda anahtarı kullanıyoruz.
Wordnik API Çağrısı
r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}")
Burada kimlik doğrulama için API Key'imizi geçirirken Wordnik API'sine GET isteği yapmak için request modülünü kullanıyoruz.
Kelimeyi veritabanına kaydetme
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 yanıtını ayrıştırdıktan sonra kelime tanımını veritabanımıza kaydediyoruz. Burada create
yöntemi yerine get_or_create
yöntemini kullanıyoruz, böylece aynı kelimenin Wordnik API tarafından tekrarlanması durumunda veritabanımızda birden fazla kopyasını oluşturmayız.
Wordnik API Yanıtı
İşte Günün Sözü uç noktası için Wordnik API yanıtının nasıl göründüğü. Yanıtın ilgisiz bölümlerinden bazıları, konuyu kısaltmak amacıyla kısaltılmıştır.
{ "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 Worker'ı terminalinize aşağıdaki komutu yazarak başlatabilirsiniz:
python manage.py run_huey
Yukarıdaki komuta, konsola neyin kaydedileceğini değiştirecek birden fazla bayrak iletebilirsiniz, örneğin:
-v, --verbose
- ayrıntılı günlük kaydı (DEBUG düzeyini içerir)-q, --quiet
- minimum günlük kaydı-S, --simple
- basit kayıt formatı (“zaman mesajı”)
Günlüğe kaydetmeye ilişkin diğer çeşitli seçeneklere bakmak için buradaki dokümanlara göz atın.
Huey, görev içinde hangi işlemleri gerçekleştirdiğinize bağlı olarak birden fazla görev dekoratörüyle birlikte gelir.
Aşağıda bunların hepsinin ne işe yaradığını kısaca anlatacağım.
İşte tüm dekoratörler için ithalat bildirimi:
from huey.contrib.djhuey import task, periodic_task, db_task, db_periodic_task
task
: Düzenli bir görev.periodic_task
: Bir görevi bir zamanlamaya göre periyodik olarak çalıştırmak istediğinizde.db_task
: Göreviniz dahilinde DB işlemlerini gerçekleştirmek istediğinizde.db_periodic_task
: Periyodik bir görevde DB işlemlerini gerçekleştirmek istediğinizde.Görevlerinizi planlamak için crontab'ı nasıl kullanabileceğinize dair size birkaç örnek daha göstereyim.
crontab(minute='*/3')
görevi her üç dakikada bir çalışacak şekilde planlar.crontab(hour='*/3', minute='5')
her üç saatte bir 5 dakika sonra çalışacak bir görev oluşturur.crontab(minute='00', hour='10', month='*/2', day_of_week='*/5')
her 2. ayda, haftanın 5. gününde çalışacak bir görev oluşturur. 10:00. Örneğin, tasks.py
içinde tanımlanmış olan aşağıdaki göreve sahipsiniz:
from huey.contrib.djhuey import task @task() def count(): for i in range(10): print(i)
Şimdi bu görevi çağırmak ancak 5 saniye sonra çalışmasını istiyorsanız aşağıdakileri yapabilirsiniz:
count.schedule(delay=5)
delay
parametresi saniye cinsinden değer alır, dolayısıyla 5 dakika sonra çalışmasını istiyorsanız 300 saniye belirtin.
Mevcut görevimize aşağıdaki mantığı eklediğinizi varsayalım:
@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"] )
Bu nedenle, yanıtın durum kodunu kontrol etme mantığını ekledik ve eğer 200'den farklı bir şeyse, o görevi 2 defaya kadar yeniden deneyecek. Ancak bu yeniden denemeler, iki deneme arasında herhangi bir zaman aralığı olmadan gerçekleşecektir. Peki ya bu görevin birden fazla denemesini ertelemek isterseniz? Bunu retry_delay
argümanını ileterek yapabiliriz, değerleri saniyeler içinde kabul eder.
@db_periodic_task(crontab(hour="18", minute="00"), retries=2, retry_delay=10)
Bu, birden fazla deneme arasında 10 saniyelik bir gecikmeye neden olur.
Huey, Django'da geliştirme sırasında Huey ile çalışmayı kolaylaştıran varsayılan bir ayarla birlikte gelir. Yani, settings.py
dosyanızda DEBUG=True
mevcut olduğunda, görevler tıpkı normal işlev çağrıları gibi eşzamanlı olarak yürütülecektir. Bunun amacı, testleri geliştirirken veya çalıştırırken hem Redis'i hem de ek bir tüketici sürecini çalıştırmaktan kaçınmaktır. Bu konuda daha fazlasını buradan okuyabilirsiniz.
Bunun için settings.py
dosyasına aşağıdaki satırı eklememiz gerekiyor:
HUEY = {}
Ancak bu davranışı geçersiz kılmak istiyorsanız bunun yerine aşağıdaki Huey yapılandırmasını ekleyebilirsiniz:
HUEY = { "immediate": False }
settings.py
dosyasında belirtilen yukarıdaki yapılandırmaya sahipseniz, DEBUG=True
değerine sahipken Huey, Redis'i kurmanızı ve run_huey
komutunu kullanarak Huey Worker'ı çalıştırmanızı isteyecektir.
Kereviz ile karşılaştırıldığında Huey hakkında bazı gözlemler şunlardır:
run_huey
komutunu kullanarak yalnızca bir hizmeti çalıştırmamız gerekir.