निर्धारित कार्य निर्धारित करें?


519

मैं Django का उपयोग करके एक वेब ऐप पर काम कर रहा हूं, और अगर समय-समय पर काम चलाने के लिए नौकरी शेड्यूल करने का एक तरीका है, तो मैं उत्सुक हूं।

मूल रूप से मैं सिर्फ डेटाबेस के माध्यम से चलना चाहता हूं और स्वचालित, नियमित आधार पर कुछ गणना / अपडेट करना चाहता हूं, लेकिन ऐसा करने पर मुझे कोई दस्तावेज नहीं मिल सकता है।

क्या किसी को पता है कि यह कैसे स्थापित करना है?

स्पष्ट करने के लिए: मुझे पता है कि मैं ऐसा करने के लिए एक cronनौकरी स्थापित कर सकता हूं , लेकिन मुझे उत्सुकता है अगर Django में कुछ सुविधा है जो यह कार्यक्षमता प्रदान करती है। मैं चाहूंगा कि लोग इस ऐप को बहुत कॉन्फिग (अधिमानतः शून्य) किए बिना खुद को तैनात कर सकें।

मैंने इन कार्यों को "रेट्रोएक्टली" से शुरू करने पर विचार किया है कि अगर अंतिम बार साइट पर एक अनुरोध भेजा गया था, तो नौकरी की जाँच होनी चाहिए, लेकिन मैं कुछ साफ करने की उम्मीद कर रहा हूं।


1
यदि आप एक उच्च प्रदर्शन वाली साइट हैं और पहले से ही यहाँ RabbitMQ का उपयोग कर रहे हैं तो क्रोन
Van Gale

अगर मैं सही समझता हूं, तो आपको Django में कुछ कार्यों को शेड्यूल करना होगा। इन दिनों मैं जो सबसे अच्छी चीज ढूंढ रहा हूं वह यह है: celery.github.com/celery/index.html
अली निकेनेशन

आप इस बारे में क्या सोचते है? github.com/reavis/django-cron
Domenico Monaco

टिक सिर्फ इस काम से बचने के लिए किया गया है। [अस्वीकरण] मैं टिक का निर्माण करता हूं।
सिसकिया

2
github.com/coleifer/huey Huey को यहां एक उल्लेख की आवश्यकता है। यह Django के साथ सेटअप करने के लिए हास्यास्पद आसान है।
ब्रैंडन बर्टेल्सन

जवाबों:


363

एक समाधान जो मैंने नियोजित किया है वह है:

1) एक कस्टम प्रबंधन कमांड बनाएँ , जैसे

python manage.py my_cool_command

2) आवश्यक समय पर मेरी कमांड चलाने के लिए ( cronलिनक्स पर) या at(विंडोज पर ) का उपयोग करें ।

यह एक सरल समाधान है जिसमें भारी एएमक्यूपी स्टैक स्थापित करने की आवश्यकता नहीं होती है। हालाँकि अन्य उत्तरों में उल्लिखित सेलेरी जैसी किसी चीज़ का उपयोग करने के अच्छे फायदे हैं। विशेष रूप से, अजवाइन के साथ अपने एप्लिकेशन लॉजिक को कॉट्रैब फ़ाइलों में नहीं फैलाना अच्छा है। हालांकि क्रोन समाधान एक छोटे से मध्यम आकार के अनुप्रयोग के लिए काफी अच्छी तरह से काम करता है और जहां आप बहुत अधिक बाहरी निर्भरता नहीं चाहते हैं।

संपादित करें:

विंडोज़ के बाद के संस्करण में atकमांड को विंडोज 8, सर्वर 2012 और इसके बाद के संस्करण के लिए पदावनत किया गया है। आप schtasks.exeएक ही उपयोग के लिए उपयोग कर सकते हैं।

**** अद्यतन **** कस्टम प्रबंधन कमांड लिखने के लिए django doc की यह नई कड़ी है


5
क्या यह बाहरी सेवाओं के बिना ऐसा करने का एक तरीका है लेकिन केवल चल रहे django फ्रेमवर्क प्रक्रिया का उपयोग करना है?
सर्गचैच

4
@Brian_Neal django_cron एप्लीकेशन
सर्गज़

2
कृपया मुझे यह समझने में मदद करें कि मैं हर महीने के आखिरी दिन क्रोन का उपयोग करके आभासी वातावरण में एक प्रबंधन कमांड कैसे चलाऊंगा।
mmrs151

2
@sergzach मैंने इस टिप्पणी का अनुसरण किया और यह पता चला कि इस नाम के दो पैकेज हैं। Google Code पर Django-क्रॉन और Github पर Django-क्रॉन । वे थोड़ा अलग हैं लेकिन दोनों दिलचस्प हैं। दोनों आपको क्रोन को एक 'जिआंगोनिक' तरीके से परिभाषित करने की अनुमति देते हैं। पहला एक थोड़ा पुराना है और एक बाहरी कार्य (यानी क्रोन) के बिना काम करना है। दूसरी तरफ दूसरे को चलाने के लिए आपको एक क्रोन सेट करना होगा python manage.py runcronsजो तब आपके द्वारा परिभाषित और पंजीकृत सभी क्रोन चलाता है।
बहाव

1
@sergzach मैं मान रहा हूं कि आप पहले एक का जिक्र कर रहे हैं, "Google कोड पर django-cron"। आप उस एक के बारे में सही हैं। यह वास्तव में इसलिए है कि मैं दूसरे के लिए विकल्प चुनता हूं, "गीथॉब पर डीजेंगो-क्रोन", क्योंकि यह ऐसा करता है इसलिए आपके पास एक साधारण कॉन्टैब सेटअप / प्रबंधन है - केवल एक क्रॉस्टैब, प्रबंधन कमांड का जिक्र करते हुए - लेकिन चूंकि आप एक अलग का उपयोग कर रहे हैं क्रोन प्रक्रिया आप इस सिंक्रनाइज़ेशन समस्या से बचें (जहां तक ​​मैं बता सकता हूं)।
बहाव

152

अजवाइन एक वितरित कार्य कतार है, जिसे AMQP (RabbitMQ) पर बनाया गया है। यह एक क्रोन की तरह फैशन में आवधिक कार्यों को भी देखता है ( आवधिक कार्यों को देखें )। आपके ऐप के आधार पर, यह एक जेंडर के लायक हो सकता है।

अजवाइन django ( डॉक्स ) के साथ स्थापित करना बहुत आसान है , और आवधिक कार्य वास्तव में एक डाउनटाइम के मामले में छूटे हुए कार्यों को छोड़ देंगे। यदि कोई कार्य विफल हो जाता है, तो अजवाइन में अंतर्निहित पुनर्प्रयास तंत्र भी होते हैं।


51

हमें लगता है कि मुझे लगता है कि यह एक संरचित ऐप है। ब्रायन के दृष्टिकोण से ऊपर भी समाधान। हम किसी भी / सभी प्रतिक्रिया प्यार करेंगे!

https://github.com/tivix/django-cron

यह एक प्रबंधन आदेश के साथ आता है:

./manage.py runcrons

वह काम करता है। प्रत्येक क्रोन को एक वर्ग के रूप में तैयार किया जाता है (इसलिए इसका सभी OO) और प्रत्येक क्रोन एक अलग आवृत्ति पर चलता है और हम सुनिश्चित करते हैं कि समान क्रोन प्रकार समानांतर में नहीं चलता है (यदि क्रोन स्वयं अपनी आवृत्ति की तुलना में चलने में अधिक समय लेते हैं!)


5
@ अचरा क्षमा करें, मुझे पता है कि यह एक गूंगा सवाल हो सकता है, लेकिन क्या यह खिड़कियों पर काम करेगा atया इसे विशेष रूप से काम करने के लिए डिज़ाइन किया गया था cron?
ब्रूनो फिंगर

38

यदि आप एक मानक POSIX OS का उपयोग कर रहे हैं, तो आप क्रोन का उपयोग करते हैं ।

आप Windows का उपयोग कर रहे हैं, तो आप का उपयोग पर

एक Django प्रबंधन आदेश लिखें

  1. पता लगाएँ कि वे किस मंच पर हैं।

  2. या तो अपने उपयोगकर्ताओं के लिए उपयुक्त "एटी" कमांड को निष्पादित करें, या अपने उपयोगकर्ताओं के लिए क्रॉसटैब को अपडेट करें।


10
अगर संभव हो तो मैं इसे अपने django ऐप में रोल-अप करना चाहता हूं।
टीएम।

@ टीएम: "मेरे डीजे ऐप में लुढ़का हुआ" क्या मतलब है? कृपया अपना प्रश्न स्पष्ट करें।
S.Lott

10
मैं चाहूंगा कि लोग स्वयं क्रोन जॉब्स स्थापित किए बिना इस ऐप को आसानी से तैनात कर सकें।
टीएम।

1
आप हमेशा अपने ऐप में क्रोन इंटरफ़ेस को लपेट सकते हैं।
मोनकुट

बीएसडी, मैक और किसी भी यूनिक्स जैसे ओएस में क्रोन है।
DylanYoung

23

दिलचस्प नया प्लगेबल Django ऐप: django-chronograph

आपको केवल एक क्रोन प्रविष्टि को जोड़ना होगा जो टाइमर के रूप में कार्य करता है, और आपके पास स्क्रिप्ट चलाने के लिए एक बहुत अच्छा Django व्यवस्थापक इंटरफ़ेस है।


2
django-chronograph असंदिग्ध है। यह कांटा बहुत बेहतर कर रहा है: github.com/chrisspen/django-chroniker
Menda

16

Django गरीब आदमी के क्रोन को देखें जो एक Django ऐप है जो लगभग नियमित अंतराल में अनुसूचित कार्यों को चलाने के लिए रोबोट, खोज इंजन अनुक्रमण रोबोट और एक जैसे का उपयोग करता है।

देखें: http://code.google.com/p/django-poormanscron/


2
यह भी मानता है कि आपका Django ऐप वेब से एक्सेस किया जा सकता है, जो LAN और VPN पर तैनाती के मामले में नहीं होगा।
टिमएच - कोडिडैक्ट

9

ब्रॉन नील का सुझाव है कि क्रोन के माध्यम से प्रबंधन कमांड चलाने का काम अच्छा है, लेकिन अगर आप कुछ अधिक मजबूत लग रहे हैं (फिर भी अजवाइन के रूप में विस्तृत नहीं है) तो मैं एक पुस्तकालय की तरह देखूंगा क्रोनोस की देखूंगा :

# app/cron.py

import kronos

@kronos.register('0 * * * *')
def task():
    pass

9

RabbitMQ और Celery में क्रोन की तुलना में अधिक सुविधाएँ और कार्य संचालन क्षमताएं हैं। यदि कार्य विफलता कोई समस्या नहीं है, और आपको लगता है कि आप अगली कॉल में टूटे हुए कार्यों को संभाल लेंगे, तो क्रोन पर्याप्त है।

सेलेरी और एएमक्यूपी आपको टूटे हुए कार्य को संभालने देगा, और यह तब तक किसी अन्य कार्यकर्ता (सेलेरी के कार्यकर्ता अगले काम के लिए सुनेंगे) द्वारा निष्पादित किया जाएगा, जब तक कि कार्य की max_retriesविशेषता नहीं हो जाती। तुम भी विफलता पर कार्य को आमंत्रित कर सकते हैं, जैसे विफलता को लॉग करना, या व्यवस्थापक को एक बार ईमेल भेजनाmax_retries तक पहुँच गया है।

और जब आप अपने एप्लिकेशन को स्केल करने की आवश्यकता होती है, तो आप Celery और AMQP सर्वर वितरित कर सकते हैं।


9

मुझे थोड़ी देर पहले भी ऐसी ही आवश्यकता थी, और APScheduler ( उपयोगकर्ता गाइड) का उपयोग करके इसे हल करना समाप्त कर दिया )

यह शेड्यूलिंग नौकरियों को सुपर सरल बनाता है, और कुछ कोड के अनुरोध-आधारित निष्पादन से इसे स्वतंत्र रखता है। निम्नलिखित एक सरल उदाहरण है।

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()
job = None

def tick():
    print('One tick!')\

def start_job():
    global job
    job = scheduler.add_job(tick, 'interval', seconds=3600)
    try:
        scheduler.start()
    except:
        pass

आशा है कि यह किसी की मदद करता है!


8

मैं व्यक्तिगत रूप से क्रोन का उपयोग करता हूं, लेकिन django- एक्सटेंशन के नौकरियां शेड्यूलिंग हिस्से दिलचस्प लगते हैं।


फिर भी ट्रिगर करने के लिए क्रोन पर निर्भर करता है, बस बीच में एक और अमूर्त परत जोड़ता है। यकीन नहीं है कि यह इसके लायक है, व्यक्तिगत रूप से।
कार्ल मेयर

मैं सहमत हूं, और इसके बारे में सोचने के बाद, मैं नहीं चाहता कि मिडलवेयर मेरी साइट को धीमा कर दे (ऊपर एएए पोएरमन्सक्रोन) जब क्रोन किसी भी तरह से बेहतर काम कर सकता है।
वैन गेल

7

हालांकि Django, Airflow का हिस्सा नहीं है एक अधिक हालिया परियोजना (2016 के अनुसार) है जो कार्य प्रबंधन के लिए उपयोगी है।

एयरफ्लो एक वर्कफ़्लो ऑटोमेशन और शेड्यूलिंग सिस्टम है जिसका उपयोग डेटा पाइपलाइनों को लेखक और प्रबंधित करने के लिए किया जा सकता है। एक वेब-आधारित यूआई इन पाइपलाइनों को प्रबंधित करने और देखने के लिए डेवलपर को कई विकल्प प्रदान करता है।

एयरफ्लो पायथन में लिखा गया है और फ्लास्क का उपयोग करके बनाया गया है।

Airflow को Airbnb में Maxime Beauchemin द्वारा बनाया गया था और 2015 के वसंत में इसे खोल दिया गया था। यह 2016 की सर्दियों में Apache Software Foundation के इनक्यूबेशन प्रोग्राम में शामिल हो गया। यहाँ Git प्रोजेक्ट पेज और कुछ अतिरिक्त पृष्ठभूमि जानकारी दी गई है


6

अपनी cron.py फ़ाइल के शीर्ष पर निम्नलिखित रखें:

#!/usr/bin/python
import os, sys
sys.path.append('/path/to/') # the parent directory of the project
sys.path.append('/path/to/project') # these lines only needed if not on path
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'

# imports and code below

6

मैंने इसके बजाय सरल समाधान के बारे में सोचा:

  1. एक दृश्य फ़ंक्शन do_work (req, param) को परिभाषित करें जैसे आप किसी अन्य दृश्य के साथ, URL मैपिंग के साथ, एक HttpResponse और इतने पर वापस लौटेंगे।
  2. अपनी टाइमिंग प्राथमिकताओं (या विंडोज में एटी या शेड्यूल्ड टास्क का उपयोग करके) के साथ क्रोन जॉब सेट करें जो कर्ल http: // localhost / your / mapped / url? Param = value को चलाता है ।

आप पैरामीटर जोड़ सकते हैं, लेकिन केवल URL में पैरामीटर जोड़ सकते हैं।

बताइए आप लोग क्या सोच रहे हैं।

[अद्यतन] मैं अब django- एक्सटेंशन से रनजॉब कमांड का उपयोग कर रहा हूं कर्ल के बजाय ।

मेरा क्रोन कुछ इस तरह दिखता है:

@hourly python /path/to/project/manage.py runjobs hourly

... और इतने पर दैनिक, मासिक, आदि के लिए '। आप इसे विशिष्ट कार्य चलाने के लिए भी सेट कर सकते हैं।

मुझे यह अधिक प्रबंधनीय और साफ-सुथरा लगता है। किसी दृश्य को URL मैप करने की आवश्यकता नहीं है। बस अपनी नौकरी वर्ग और crontab को परिभाषित करें और आप सेट हैं।


1
केवल समस्या यह है कि असंवेदनशील होना जरूरी है कि बैकग्राउंड जॉब को चलाने के लिए ऐप और बैंडविड्थ में लोड को जोड़ना बेहतर होगा जो कि "आंतरिक रूप से" और सेवारत ऐप से स्वतंत्र रूप से लॉन्च किया जाएगा। लेकिन इसके अलावा, यह एक चतुर n अधिक जेनेरिक django-cron है, क्योंकि यह ऐप के सर्वर के लिए बाहरी एजेंटों द्वारा भी आह्वान किया जा सकता है!
nemesisfixx

आप सही हैं, इसीलिए मैं django- कमांड-एक्सटेंशन से नौकरियों का उपयोग करने के लिए स्थानांतरित हुआ। मेरे जवाब के लिए मेरा अपडेट देखें।
माइकल

4

कोड के भाग के बाद, मैं अपने विचारों की तरह कुछ भी लिख सकता हूँ :)

#######################################
import os,sys
sys.path.append('/home/administrator/development/store')
os.environ['DJANGO_SETTINGS_MODULE']='store.settings'
from django.core.management impor setup_environ
from store import settings
setup_environ(settings)
#######################################

से http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/


3

आपको निश्चित रूप से django-q की जांच करनी चाहिए! इसके लिए किसी अतिरिक्त विन्यास की आवश्यकता नहीं है और संभवतः वाणिज्यिक परियोजनाओं पर किसी भी उत्पादन के मुद्दों को संभालने के लिए आवश्यक सब कुछ है।

यह सक्रिय रूप से विकसित है और django, django ORM, mongo, redis के साथ बहुत अच्छी तरह से एकीकृत है। यहाँ मेरा विन्यास है:

# django-q
# -------------------------------------------------------------------------
# See: http://django-q.readthedocs.io/en/latest/configure.html
Q_CLUSTER = {
    # Match recommended settings from docs.
    'name': 'DjangoORM',
    'workers': 4,
    'queue_limit': 50,
    'bulk': 10,
    'orm': 'default',

# Custom Settings
# ---------------
# Limit the amount of successful tasks saved to Django.
'save_limit': 10000,

# See https://github.com/Koed00/django-q/issues/110.
'catch_up': False,

# Number of seconds a worker can spend on a task before it's terminated.
'timeout': 60 * 5,

# Number of seconds a broker will wait for a cluster to finish a task before presenting it again. This needs to be
# longer than `timeout`, otherwise the same task will be processed multiple times.
'retry': 60 * 6,

# Whether to force all async() calls to be run with sync=True (making them synchronous).
'sync': False,

# Redirect worker exceptions directly to Sentry error reporter.
'error_reporter': {
    'sentry': RAVEN_CONFIG,
},
}

3

Django APScheduler अनुसूचक नौकरियों के लिए। उन्नत पायथन शेड्यूलर (APScheduler) एक पायथन लाइब्रेरी है जो आपको अपने पायथन कोड को बाद में या तो एक या समय-समय पर निष्पादित करने की अनुमति देता है। आप नई नौकरियों को जोड़ सकते हैं या अपनी पसंद के अनुसार पुराने लोगों को हटा सकते हैं।

नोट: मैं इस पुस्तकालय का लेखक हूं

APScheduler स्थापित करें

pip install apscheduler

कॉल करने के लिए फ़ाइल फ़ंक्शन देखें

फ़ाइल का नाम: अनुसूचक_ मुखमैथुन

def FirstCronTest():
    print("")
    print("I am executed..!")

शेड्यूलर को कॉन्फ़िगर करना

execute.py फ़ाइल बनाएं और नीचे दिए गए कोड जोड़ें

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()

आपके लिखित कार्य यहां, शेड्यूलर फ़ंक्शन शेड्यूलर_ मुखमैथुन में लिखे गए हैं

import scheduler_jobs 

scheduler.add_job(scheduler_jobs.FirstCronTest, 'interval', seconds=10)
scheduler.start()

निष्पादन के लिए फ़ाइल को लिंक करें

अब, Url फ़ाइल के निचले भाग में नीचे की पंक्ति जोड़ें

import execute

2

मुझे आज आपकी समस्या के साथ कुछ ऐसा ही लगा।

मैं इसे सर्वर ट्रह क्रोन द्वारा संभाला नहीं करना चाहता था (और अधिकांश लिबास अंत में क्रोन मददगार थे)।

इसलिए मैंने एक शेड्यूलिंग मॉड्यूल बनाया है और इसे init से जोड़ा है ।

यह सबसे अच्छा तरीका नहीं है, लेकिन यह मुझे एक ही स्थान पर सभी कोड और मुख्य ऐप से संबंधित निष्पादन के साथ मदद करता है।


2

हां, ऊपर की विधि इतनी शानदार है। और मैंने उनमें से कुछ की कोशिश की। अंत में, मुझे इस तरह एक विधि मिली:

    from threading import Timer

    def sync():

        do something...

        sync_timer = Timer(self.interval, sync, ())
        sync_timer.start()

जैसा कि रिकर्सिव

ठीक है, मुझे आशा है कि यह विधि आपकी आवश्यकता को पूरा कर सकती है। :)


1
बंद हो जाएगा अगर आपका 'कुछ' कभी विफल हो जाता है, तो सुनिश्चित करें कि आप इसके भीतर सभी अपवादों को संभालते हैं। फिर भी, वेब सर्वर किसी बिंदु पर आपके धागे को मार सकता है, यह नहीं हो सकता है?
लुत्ज प्रेचल

2

एक और आधुनिक समाधान (सेलेरी की तुलना में) है Django Q: https://django-q.readthedocs.io/en/latest/index.html

यह महान प्रलेखन है और ग्रू करने के लिए आसान है। विंडोज सपोर्ट की कमी है, क्योंकि विंडोज फोर्किंग की प्रक्रिया का समर्थन नहीं करता है। लेकिन यह ठीक काम करता है यदि आप लिनक्स सबसिस्टम के लिए विंडोज का उपयोग करके अपना देव वातावरण बनाते हैं।


ऐसा लगता है कि आप अभी भी विंडोज
युसिन वाशियो

1

मैं अपने आवधिक कार्यों को बनाने के लिए अजवाइन का उपयोग करता हूं। पहले आपको इसे इस प्रकार स्थापित करना होगा:

pip install django-celery

django-celeryअपनी सेटिंग में पंजीकरण करना न भूलें और फिर आप कुछ ऐसा कर सकते हैं:

from celery import task
from celery.decorators import periodic_task
from celery.task.schedules import crontab
from celery.utils.log import get_task_logger
@periodic_task(run_every=crontab(minute="0", hour="23"))
def do_every_midnight():
 #your code

2
मैंने देखा कि यह सलाह पुरानी है और आप सीधे अजवाइन को एकीकृत कर सकते हैं। देखें pypi.python.org/pypi/django-celery जानकारी के लिए।
पीटर ब्रिटैन

अजवाइन डॉक्स का कहना है कि यह v3.1 में बदलाव था। मैंने खुद इसे अभी तक आज़माया नहीं है।
पीटर ब्रिटैन 16

1

मुझे यकीन नहीं है कि यह किसी के लिए भी उपयोगी होगा, क्योंकि मुझे नौकरियों को शेड्यूल करने के लिए सिस्टम के अन्य उपयोगकर्ताओं को प्रदान करना था, उन्हें वास्तविक सर्वर (विंडोज़) टास्क शेड्यूलर तक पहुंच प्रदान किए बिना, मैंने इस पुन: प्रयोज्य एप्लिकेशन को बनाया।

कृपया ध्यान दें कि उपयोगकर्ताओं के पास सर्वर पर एक साझा फ़ोल्डर तक पहुंच है जहां वे आवश्यक कमांड / कार्य / .bat फ़ाइल बना सकते हैं। यह कार्य तब इस एप्लिकेशन का उपयोग करके निर्धारित किया जा सकता है।

ऐप का नाम Django_Windows_Scheduler है

स्क्रीनशॉट: यहाँ छवि विवरण दर्ज करें


0

यदि आप सेलेरी की तुलना में अधिक विश्वसनीय कुछ चाहते हैं , तो टास्कहॉक का प्रयास करें जो एडब्ल्यूएस एसक्यूएस / एसएनएस के शीर्ष पर बनाया गया है

देखें: http://taskhawk.readthedocs.io


0

सरल डॉक्यूज्ड प्रोजेक्ट्स के लिए, मैं वास्तव में किसी भी मौजूदा जवाब को फिट नहीं देख सकता था।

इसलिए मैंने बाहरी पुस्तकालयों या ट्रिगर्स की आवश्यकता के बिना बहुत नंगे हल लिखा, जो अपने आप चलता है। किसी बाहरी ओएस-क्रोन की जरूरत नहीं है, हर वातावरण में काम करना चाहिए।

यह एक मिडलवेयर को जोड़कर काम करता है: middleware.py

import threading

def should_run(name, seconds_interval):
    from application.models import CronJob
    from django.utils.timezone import now

    try:
        c = CronJob.objects.get(name=name)
    except CronJob.DoesNotExist:
        CronJob(name=name, last_ran=now()).save()
        return True

    if (now() - c.last_ran).total_seconds() >= seconds_interval:
        c.last_ran = now()
        c.save()
        return True

    return False


class CronTask:
    def __init__(self, name, seconds_interval, function):
        self.name = name
        self.seconds_interval = seconds_interval
        self.function = function


def cron_worker(*_):
    if not should_run("main", 60):
        return

    # customize this part:
    from application.models import Event
    tasks = [
        CronTask("events", 60 * 30, Event.clean_stale_objects),
        # ...
    ]

    for task in tasks:
        if should_run(task.name, task.seconds_interval):
            task.function()


def cron_middleware(get_response):

    def middleware(request):
        response = get_response(request)
        threading.Thread(target=cron_worker).start()
        return response

    return middleware

models/cron.py:

from django.db import models


class CronJob(models.Model):
    name = models.CharField(max_length=10, primary_key=True)
    last_ran = models.DateTimeField()

settings.py:

MIDDLEWARE = [
    ...
    'application.middleware.cron_middleware',
    ...
]

0

सरल तरीका यह है कि एक कस्टम शेल कमांड लिखी जाए जोंगो डॉक्यूमेंटेशन देखें और लिनक्स पर क्रोनजोब का उपयोग करके इसे निष्पादित करें। हालाँकि मैं अत्यधिक मैसेज ब्रोकर जैसे कि RabbitMQ को अजवाइन के साथ मिलाकर उपयोग करने की सलाह दूंगा। हो सकता है कि आप इस ट्यूटोरियल को देख सकें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.