python - पाइथन फ्लास्क ढांचे में पुनरावर्ती कार्य कैसे चलाएं?



cron flask (1)

(1)

आप अनुप्रयोग संदर्भ सेट करने के लिए app.app_context() संदर्भ प्रबंधक का उपयोग कर सकते हैं। मुझे लगता है कि उपयोग कुछ ऐसा होगा:

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)

वैकल्पिक रूप से, आप एक सजावट का उपयोग कर सकते हैं

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)

हाँ यह अभी भी काम करेगा। एकमात्र (महत्वपूर्ण) अंतर यह है कि आपका आवेदन सीधे दुनिया के साथ संचार नहीं करेगा; यह एक रिवर्स प्रॉक्सी या Fastcgi / uwsgi / जो कुछ भी के माध्यम से कुछ जा रहा है। एकमात्र चिंता यह है कि यदि आपके पास ऐप शुरू होने के कई उदाहरण हैं, तो एकाधिक शेड्यूलर बनाए जाएंगे। इसका प्रबंधन करने के लिए, मैं सुझाव दूंगा कि आप अपने बैकएंड कार्यों को फ्लास्क एप्लिकेशन से बाहर ले जाएं, और नियमित रूप से कार्य चलाने के लिए डिज़ाइन किए गए टूल का उपयोग करें (यानी सेलेरी)। इसका नकारात्मक पक्ष यह है कि आप फ्लास्क-मेल जैसी चीजों का उपयोग करने में सक्षम नहीं होंगे, लेकिन आईएमओ, फ्लास्क पारिस्थितिकी तंत्र से इतनी बारीकी से बंधे रहने के लिए बहुत अच्छा नहीं है; मानक, गैर फ्लास्क, मेल लाइब्रेरी पर फ्लास्क-मेल का उपयोग करके आप क्या प्राप्त कर रहे हैं?

साथ ही, अपने आवेदन को तोड़ना व्यक्तिगत घटकों को स्केल करना अधिक आसान बनाता है क्योंकि एक मोनोलिथिक वेब एप्लिकेशन की तुलना में क्षमता की आवश्यकता होती है।

मैं एक वेबसाइट बना रहा हूं जो आगंतुकों को कुछ जानकारी प्रदान करता है। यह जानकारी प्रत्येक 5 सेकंड में कुछ बाहरी एपीआई मतदान करके पृष्ठभूमि में एकत्रित होती है। जिस तरह से मैं इसे अभी काम कर रहा हूं वह यह है कि मैं APScheduler नौकरियों का उपयोग करता APScheduler । मैंने शुरुआत में एपीएसड्यूलर को प्राथमिकता दी क्योंकि यह पूरे सिस्टम को पोर्ट के लिए अधिक आसान बनाता है (क्योंकि मुझे नई मशीन पर क्रॉन नौकरियां सेट करने की आवश्यकता नहीं है)। मैं मतदान कार्यों को निम्नानुसार शुरू करता हूं:

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)

इस तरह के काम करता है, लेकिन इसके साथ कुछ परेशानी है:

  1. शुरुआत के लिए, इसका मतलब है कि अंतराल-नौकरियां फ्लास्क संदर्भ के बाहर चल रही हैं। अब तक यह कोई समस्या नहीं है, लेकिन जब एंडपॉइंट कॉल करना विफल रहता है, तो मैं चाहता हूं कि सिस्टम मुझे एक ईमेल भेजें ("हे कॉलिंग एपीआई एक्स असफल" कह रहा है)। चूंकि यह फ्लास्क संदर्भ में नहीं चलता है, हालांकि, यह शिकायत करता है कि flask-mail निष्पादित नहीं किया जा सकता है ( RuntimeError('working outside of application context') )।
  2. दूसरा, मुझे आश्चर्य है कि जब मैं फ्लास्क बिल्ट-इन डीबग सर्वर का उपयोग नहीं करता, तो यह व्यवहार कैसे करेगा, लेकिन एक उत्पादन सर्वर 4 श्रमिकों को कहता है। क्या यह चार बार हर नौकरी शुरू करेगा?

सब कुछ मुझे लगता है कि इन पुनरावर्ती कार्यों को चलाने का एक बेहतर तरीका होना चाहिए, लेकिन मुझे यकीन नहीं है कि कैसे। क्या इस समस्या के लिए कोई भी दिलचस्प समाधान है? सभी सुझावों का स्वागत है!

[संपादित करें] मैं सिर्फ अपने schedules साथ Celery बारे में पढ़ रहा हूं। हालांकि मैं वास्तव में नहीं देखता कि कैसे सेलेरी एपीएसड्यूलर से अलग है और क्या यह मेरे दो बिंदुओं को हल कर सकता है, मुझे आश्चर्य है कि अगर कोई इसे पढ़ता है तो मुझे लगता है कि मुझे सेलेरी में और जांच करनी चाहिए?

[निष्कर्ष] लगभग दो साल बाद मैं इसे पढ़ रहा हूं, और मैंने सोचा कि मैं आपको लोगों को यह बता सकता हूं कि मैं किसके साथ समाप्त हुआ। मुझे लगा कि @ ब्लूपेपर सही कह रहे थे कि मुझे फ्लास्क पारिस्थितिकी तंत्र से इतनी बारीकी से बंधे नहीं जाना चाहिए। इसलिए मैंने प्रत्येक मिनट चलने वाले नियमित क्रॉन-जॉब्स का चयन किया जो Ansible का उपयोग कर सेट हैं। यद्यपि यह थोड़ा और जटिल बनाता है (मुझे जवाब सीखने और कुछ कोड बदलने की आवश्यकता है ताकि इसे हर मिनट चलाना पर्याप्त होगा) मुझे लगता है कि यह अधिक मजबूत है। मैं वर्तमान में pythonr-rq ए-सिंक जॉब्स (एपीआई जांचना और ईमेल भेजना) के लिए भयानक pythonr-rq का उपयोग कर रहा हूं। मुझे बस rq-scheduler बारे में पता चला। मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन ऐसा लगता है कि मुझे पहले स्थान पर क्या चाहिए था। तो शायद यह इस प्रश्न के भविष्य के पाठकों के लिए एक टिप है।

बाकी के लिए, मैं बस आप सभी को एक सुंदर दिन की कामना करता हूं!





apscheduler