2014-09-03 8 views
21

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

  1. , 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')).
  2. İ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!

cevap

22

(1)

Sen uygulama bağlamını ayarlamak için app.app_context() bağlam yöneticisini kullanabilirsiniz. Ben kullanım böyle bir şey giderdim düşünün:

from apscheduler.scheduler import Scheduler 

def checkSecondApi(): 
    with app.app_context(): 
     # Do whatever you were doing to check the second API 

@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) 

Alternatif olarak,

def with_application_context(app): 
    def inner(func): 
     @functools.wraps(func) 
     def wrapper(*args, **kwargs): 
      with app.app_context(): 
       return func(*args, **kwargs) 
     return wrapper 
    return inner 

@with_application_context(app) 
def checkFirstAPI(): 
    # Check the first API as before 

(2)

Evet o hala çalışır bir dekoratör kullanabilirsiniz. Taban (önemli) fark, uygulamanızın doğrudan dünyayla iletişim kurmayacağı; fastcgi/uwsgi/neyse aracılığıyla bir ters vekilden veya bir şeyden geçiyor olacak.Tek endişe, uygulamanın başlamasına ilişkin birden fazla örneğiniz varsa, birden fazla program oluşturulacak olmasıdır. Bunu yönetmek için, arka uç görevlerinizi Flask uygulamasından çıkarmanızı ve görevleri düzenli olarak çalıştırmak için tasarlanmış bir araç kullanmanızı öneririm (örneğin, Kereviz). Bunun dezavantajı, Flask-Mail gibi şeyleri kullanamayacağınızdır, ancak imo, Flask ekosistemine çok yakın olmak için çok iyi değildir; Flask-Mail'i standart olmayan bir Flask, posta kütüphanesi üzerinden ne kazanıyorsunuz? Ayrıca, uygulamanızın ayrılması, tek bir bileşeni, tek bir monolitik web uygulamasına sahip olmakla karşılaştırıldığında, kapasite gereksinimi kadar ölçeklendirmeyi çok daha kolay hale getirmektedir.

+0

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

+0

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

+0

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