Arka plan O yüzden bugün göre çok daha kolay kurulumla gelen ve Kereviz'e göre boyutları çok daha küçük olan isimli bir Kereviz alternatifinden bahsedeceğim. Kereviz'e Huey 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. Önkoşullar Aşağıdaki paketleri kuracağız: redis Django Huey istekler (isteğe bağlı, demo için gerekli) GitHub Deposu 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. Proje Kurulumu Proje Dizinini Oluşturun 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 Sanal çevre 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 Bağımlılıkları Yükleme 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. Projeyi Oluştur 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ı projesine ekleyin, aşağıdaki değişiklikleri yapın: settings.py INSTALLED_APPS = [ # Existing Apps "demo.apps.DemoConfig", # <== Add this line ] dosyasında hata ayıklama modunu olarak ayarlayın: settings.py False 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. Projeye Genel Bakış Artık projemizi oluşturmayı bitirdiğimize göre, bugün inşa edeceğimiz şeyin sorumluluğunu size almanın tam zamanı. 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. Wordnik API'sinden 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. Wordnik API Anahtarını Alma API anahtarını almak için takip edebilirsiniz. bu kılavuzu Projemizi Kodlama Huey'i Projemize Ekleyin Projemizin yüklü uygulamalarına Huey'i eklememiz gerekiyor, bu yüzden dosyasında aşağıdaki değişiklikleri yapın: settings.py INSTALLED_APPS = [ # Existing apps 'huey.contrib.djhuey', # <== Add this line ] Redis'i yükleyin 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şvurabilirsiniz. bağlantıya Docker'ı kullanmakta rahatsanız aşağıdaki komutu kullanabilirsiniz: docker run --name redis_huey -p 6379:6379 -d redis Huey varsayılan olarak üzerinde çalışan Redis sunucusuna bağlanmayı deneyecektir. Eğer mevcut değilse, bir hata ortaya çıkaracaktır. localhost:6379 Model Tanımı dosyanıza aşağıdaki kodu ekleyin: 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 Geçişler yapın: python manage.py makemigrations demo Geçişleri uygula: python manage.py migrate demo Görev Tanımı Demo uygulama dizininde adlı bir dosya oluşturun. Dosyamıza 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 Huey belgelerine göz atabilirsiniz. tasks.py tasks.py buradan Görev tanımını yazmadan önce ek bir bağımlılık yüklememiz gerekiyor. Terminalinize aşağıdakini yazarak yükleyin: requests 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")) 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 yararlanabilirsiniz, ben her zaman kullanıyorum. crontab(hour="18", minute="00") bu web sitesinden Wordnik API Anahtarı from django.conf import settings # Usage ## settings.WORDNIK_API_KEY 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. ortam değişkeninden hangi ayar dosyasını kullandığımızı bulur. Ancak bu ayrıntılar hakkında endişelenmenize gerek yok. from django.conf import settings DJANGO_SETTINGS_MODULE 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 yöntemi yerine yöntemini kullanıyoruz, böylece aynı kelimenin Wordnik API tarafından tekrarlanması durumunda veritabanımızda birden fazla kopyasını oluşturmayız. create get_or_create 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 İşçisini Çalıştırmak 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: - ayrıntılı günlük kaydı (DEBUG düzeyini içerir) -v, --verbose - minimum günlük kaydı -q, --quiet - basit kayıt formatı (“zaman mesajı”) -S, --simple Günlüğe kaydetmeye ilişkin diğer çeşitli seçeneklere bakmak için dokümanlara göz atın. buradaki Huey ile Başka Ne Yapabilirsiniz? Görev Dekoratörleri 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 : Düzenli bir görev. task : Bir görevi bir zamanlamaya göre periyodik olarak çalıştırmak istediğinizde. periodic_task : Göreviniz dahilinde DB işlemlerini gerçekleştirmek istediğinizde. db_task : Periyodik bir görevde DB işlemlerini gerçekleştirmek istediğinizde. db_periodic_task Crontab Örnekleri Görevlerinizi planlamak için crontab'ı nasıl kullanabileceğinize dair size birkaç örnek daha göstereyim. görevi her üç dakikada bir çalışacak şekilde planlar. crontab(minute='*/3') her üç saatte bir 5 dakika sonra çalışacak bir görev oluşturur. crontab(hour='*/3', minute='5') her 2. ayda, haftanın 5. gününde çalışacak bir görev oluşturur. 10:00. crontab(minute='00', hour='10', month='*/2', day_of_week='*/5') Görevleri Planlama Örneğin, içinde tanımlanmış olan aşağıdaki göreve sahipsiniz: tasks.py 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) parametresi saniye cinsinden değer alır, dolayısıyla 5 dakika sonra çalışmasını istiyorsanız 300 saniye belirtin. delay Başarısız Olan Görevleri Yeniden Denemek 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 argümanını ileterek yapabiliriz, değerleri saniyeler içinde kabul eder. retry_delay @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. Geliştirme Modu Huey, Django'da geliştirme sırasında Huey ile çalışmayı kolaylaştıran varsayılan bir ayarla birlikte gelir. Yani, dosyanızda 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ı okuyabilirsiniz. settings.py DEBUG=True buradan Bunun için dosyasına aşağıdaki satırı eklememiz gerekiyor: settings.py HUEY = {} Ancak bu davranışı geçersiz kılmak istiyorsanız bunun yerine aşağıdaki Huey yapılandırmasını ekleyebilirsiniz: HUEY = { "immediate": False } dosyasında belirtilen yukarıdaki yapılandırmaya sahipseniz, değerine sahipken Huey, Redis'i kurmanızı ve komutunu kullanarak Huey Worker'ı çalıştırmanızı isteyecektir. settings.py DEBUG=True run_huey Kereviz vs Huey Kereviz ile karşılaştırıldığında Huey hakkında bazı gözlemler şunlardır: Kereviz ile karşılaştırıldığında daha az bağımlılık alanı. Kereviz beraberinde kombu ve bilardo da kurar. Bu arada Huey'nin herhangi bir bağımlılığı yok. Periyodik görevler için daha az hizmetin çalıştırılması gerekir, Kereviz, periyodik görevlerle çalışmak için beat hizmetinin ve bir çalışan hizmetinin çalıştırılmasını gerektirir, bu arada komutunu kullanarak yalnızca bir hizmeti çalıştırmamız gerekir. run_huey Referanslar Huey Dokümanları Wordnik API'si İlgili Github Repo'su