Herkese Selamlar,
Geliştirme yaparken zamanla odağımızın kod yazımından uygulama üzerindeki etkilerini takip etmeye doğru kaydığını görebiliriz.
Ben de böyle bir durumdayken Celery
uygulamasında yaptığım kod değişikliğini görebilmek için çalışan uygulamayı kapatıp tekrar açmak gerektiğinden zaman zaman beni yorduğu olmuştur.
Buna kalıcı olarak çözüm bulabilmek için araştırma yaparken watchdog
modülünün watchmedo
aracını kullanabileceğimi gördüm.
Yararlandığım kaynakları dökümanın sonuna ekledim.
Uygulamanın çalışmasını görmek için : https://asciinema.org/a/398944
Yazının devamında örnek celery
task 'ı hazırlarken ayrıca geliştirme ortamında kullanmak üzere watchmedo
aracını entegre edeceğiz. Bu araç tanımladığınız argümanlara göre belirttiğimiz dosyalar üzerinde olan herhangi bir değişikliği algılayarak uygulamaya SIGINT
, SIGTERM
, SIGKILL
(terminalde Ctrl+C, Ctrl+D ...) gibi sinyaller gönderebiliyoruz.
Celery distributed task queue
uygulamasıdır. Birçok uygulamanın yoğun ve gecikme oluşturacak süreçleri beklemesini önlemek için bu gibi işlemleri celery gibi uygulamalarda sürdürmek, uygulamanın büyümesi ve yoğun kullanımının artmasıyla bir süre sonra zorunlu hale gelmektedir.
Celery
harici uygulamalardan gelen mesajlar ile çalışabildiği gibi dahili olarakta kendi içerisinde hazırlanan taskları belirli aralıklarda çalıştırarakta kullanılabilir.
Kullanacağımız araçlar kısaca docker
üzerinde redis
, python
3.6 veya üzeri bir sürümü ve python virtualenv
veya venv
modülü kurulu olması gerekmektedir.
Uygulamaya github üzerinden erişmek için : https://github.com/ozkansen/python_celery_example
celery[redis]
watchdog[watchmedo]
from celery import Celeryapp = Celery("tasks", broker="redis://127.0.0.1:6379/0")app.conf.update(
timezone="Europe/Istanbul",
enable_utc=True,
include=["tasks"],
beat_schedule={"example": {"task": "tasks.example.ExampleTask", "schedule": 5}},
)from .example import ExampleTaskfrom celery import Taskfrom main import appclass ExampleTask(Task):
def run(self, *args, **kwargs):
passapp.register_task(ExampleTask)
Evet içerikleri yukarıda olan dosyaları aynı düzen ve isimde oluşturduysanız kuruluma geçebiliriz.
Burada python
için virtualenv
veya venv
paketini kullanabiliriz. Ben virtualenv
e göre anlatacağım.
virtualenv .venv
# veya venv için -> python3 -m venv .venv
source .venv/bin/activatepip install -r requirements.txt
Redis
için docker
kullanacağız
docker run -it -p 6379:6379 redis:alpine
Kurulumlar bittikten sonra aşağıdaki şekilde çalıştırdığınızda artık celery
i manuel olarak durdurup başlatmanıza gerek kalmayacak bu işlem için watchmedo
aracı sizin yerinize bu işi yapacaktır.
# python ortamını etkinleştirin
source .venv/bin/activate# mevcut klasörde herhangi bir python dosyasında değişiklik
# yapıldığı zaman algılayarak yeniden başlatır.
watchmedo auto-restart \
--directory=./ \
--pattern=*.py \
--recursive -- \
celery -A main \
worker \
-B \
-l DEBUG
Burada watchmedo
aracını celery
üzerinde kullanımını gördük, bu araçlar birçok framework içerisinde dahili olarak geliyor (flask —reload
vb..) celery
nin eski sürümlerinde benzer bir kullanım vardı fakat ilerleyen sürümlerinde kaldırıldı.
Yazılım geliştirme ortamlarında birçok alternatif var watchmedo
ise sadece bunlardan biri, ayrıca bu ve buna benzer araçları (inotify-tools
vb..) birçok yerde kullanabilirsiniz.
Bunun gibi araçlar hayat kurtarmasada geliştirme süreçlerini pratikleştirdiği için işinize yarayacağını düşünüyorum.
Kaynaklar:
- Celery documentation
- Github celery source code
- Auto-reload Celery on code changes
- Watchdog documentation
- Github watchdog source code
Herkese sağlıklı mutlu günler dilerim.