Python Celery geliştirme ortamı için notlar

Özkan ŞEN
SDTR
Published in
3 min readMar 14, 2021

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.

Python Celery terminal
Uygulamanın çalışması ..

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.

Python Celery code changes detection
Kod değişikliğini algılaması sırasında

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):
pass
app.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/activate
pip 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:

Herkese sağlıklı mutlu günler dilerim.

--

--