Ziyaretçilere bazı bilgiler sağlayan bir web sitesi yapıyorum. Bu bilgi, her 5 saniyede bir çift harici API'yi yoklayarak arka planda toplanır. Şu an çalıştığım şekilde APScheduler işlerini kullanıyorum. Başlangıçta APScheduler'ı tercih ettim çünkü tüm sistemi bağlantı noktasına getirmeyi daha kolay hale getirdi (çünkü yeni makinede cron işlerini ayarlamanıza gerek yok). aşağıdaki gibi ben yoklama fonksiyonlarını başlatmak: Bu tür işlerPython Flask çerçevesinde yinelenen görev nasıl çalıştırılır?
from apscheduler.scheduler import Scheduler
@app.before_first_request
def initialize():
apsched = Scheduler()
apsched.start()
apsched.add_interval_job(checkFirstAPI, seconds=5)
apsched.add_interval_job(checkSecondAPI, seconds=5)
apsched.add_interval_job(checkThirdAPI, seconds=5)
, ancak bazı sorun onunla var: Yeni başlayanlar için
- , bu aralık-işler Flask bağlamı dışında çalışan anlamına gelir. Şimdiye kadar bu bir sorun olmamıştı, ancak bir uç noktayı çağırırken, sistemin bana bir e-posta göndermesini istiyorum ("call call API X başarısız"). Ancak Flask bağlamında çalışmadığı için, flask-mail'un çalıştırılamayacağını bildirir (
RuntimeError('working outside of application context')
). - İkinci olarak, Flask yerleşik hata ayıklama sunucusunu kullanmadığım zaman bunun nasıl davranacağını merak ediyorum, ancak bir üretim sunucusu ile 4 çalışanı diyelim. Her işe dört kez başlayacak mı?
Sonuç olarak, bu yinelenen görevleri yürütmenin daha iyi bir yolu olması gerektiğini hissediyorum, ancak emin değilim. Dışarıda bu problem için ilginç bir çözüm var mı? Tüm ipuçları bekliyoruz!
[EDIT]schedules ile Celery hakkında daha yeni okuyorum. Gerçekten de Celery'in APScheduler'den nasıl farklı olduğunu ve bu iki noktayı çözüp çözemeyeceğini görmeme rağmen, bunu okuyan birinin Kereviz'de daha fazla araştırmam gerektiğini düşündüğünü merak ediyorum.
[SONUÇ] Yaklaşık iki yıl sonra bunu okuyordum ve size neyle sonuçlandığımı bilmelerine izin verebileceğimi düşündüm. @BluePeppers'ın Flask ekosistemine çok yakın olmamam gerektiğini söyleyerek haklı olduğunu düşündüm. Bu yüzden Ansible kullanılarak ayarlanmış her dakika çalışan düzenli cron işleri tercih ettim. Her ne kadar bu biraz daha karmaşık olsa da (Ansible'ı öğrenmek ve bazı kodları dönüştürmek için her dakikanın yeterli olmasını sağladım) bence bu daha sağlam. Şu anda bir senkronizasyon işlerini sıraya koymak (API'leri kontrol etmek ve e-posta göndermek) için harika pythonr-rq kullanıyorum. Az önce rq-scheduler'u öğrendim. Henüz test etmedim, ama ilk etapta ihtiyacım olan şeyi tam olarak yapıyor gibi görünüyor. Bu belki de bu sorunun gelecekteki okuyucuları için bir ipucudur.
Geri kalanlar için, hepinize güzel bir gün diliyorum!
Ayrıntılı cevabınız için teşekkür ederiz. Son bir şey; APScheduler mükemmel bir şekilde çalıştığı için, APScheduler üzerinden Celery kullanmanın avantajı nedir? Seçiminiz ne ve neden? – kramer65
Well Celery size basit zamanlamadan çok daha fazlasını sunuyor. Bununla birlikte, APScheduler hakkında fazla bir şey bilmiyorum ve şu anda belgeleri okuyordum, gayet iyi görünüyor. – BluePeppers
Bu yazıyı çok yararlı buluyorum. Ama sormak istediğim, başvurum için APScheduler veya Celery'in hangisinin daha uygun olacağını düşündüğüm bir SQL veritabanı kullanıyorum? Kereviz'de kızları görebiliyorum. Bunun yerine APScheduler'a gider miyim? – clementiano