मान लीजिए मेरे पास एक मॉडल है Event
। मैं इस घटना के समाप्त होने के बाद सभी आमंत्रित उपयोगकर्ताओं को एक अधिसूचना (ईमेल, धक्का, जो कुछ भी) भेजना चाहता हूं। की तर्ज पर कुछ:
class Event(models.Model):
start = models.DateTimeField(...)
end = models.DateTimeField(...)
invited = models.ManyToManyField(model=User)
def onEventElapsed(self):
for user in self.invited:
my_notification_backend.sendMessage(target=user, message="Event has elapsed")
अब, निश्चित रूप से, महत्वपूर्ण हिस्सा onEventElapsed
जब भी आह्वान करना है timezone.now() >= event.end
। ध्यान रखें, end
वर्तमान तिथि से कुछ महीने दूर हो सकते हैं।
मैंने ऐसा करने के दो मूल तरीकों के बारे में सोचा है:
एक आवधिक
cron
नौकरी का उपयोग करें (कहते हैं, हर पांच मिनट या तो) जो यह जांचता है कि क्या पिछले पांच मिनट के भीतर कोई भी घटना हुई है और इस पद्धति को निष्पादित करता है।भविष्य में (मॉडल विधि के भीतर ) पैरामीटर का उपयोग करके उपयोग करें
celery
और शेड्यूल करें ।onEventElapsed
eta
save
विकल्प 1 को देखते हुए, एक संभावित समाधान हो सकता है django-celery-beat
। हालाँकि, सूचनाएं भेजने के लिए एक निश्चित अंतराल पर किसी कार्य को चलाना थोड़ा अजीब लगता है। इसके अलावा मैं एक (संभावित) मुद्दे के साथ आया था जो (शायद) एक बहुत ही सुंदर समाधान में परिणाम देगा:
- पिछले पाँच मिनट में हुई घटनाओं के लिए हर पाँच मिनट की जाँच करें? भद्दा लगता है, हो सकता है कि कुछ घटनाएँ याद आती हों (या अन्य लोग अपनी सूचनाएँ दो बार भेजते हों?)। संभावित कार्यपटु: एक बूलियन फ़ील्ड को उस मॉडल में जोड़ें जो एक
True
बार सूचनाओं को भेजे जाने के लिए सेट है ।
फिर, विकल्प 2 में भी इसकी समस्याएं हैं:
- जब कोई ईवेंट प्रारंभ / समाप्ति डेटटाइम ले जाया जाता है, तो मैन्युअल रूप से स्थिति का ध्यान रखें। उपयोग करते समय
celery
, किसी कोtaskID
(आसान, inc) को संग्रहीत करना होगा और तिथियों को बदलने और नया कार्य जारी करने के बाद कार्य को रद्द करना होगा। लेकिन मैंने पढ़ा है, कि भविष्य में चलने वाले कार्यों से निपटने के दौरान अजवाइन की (डिज़ाइन-विशिष्ट) समस्याएं होती हैं: मिथुन पर ओपन इश्यू । मुझे एहसास है कि यह कैसे होता है और क्यों यह सब कुछ है लेकिन हल करने के लिए तुच्छ है।
अब, मैं कुछ पुस्तकालयों में आया हूँ जो संभवतः मेरी समस्या को हल कर सकते हैं:
- celery_longterm_scheduler (लेकिन इसका मतलब यह है कि मैं अजवाइन का उपयोग नहीं कर सकता जैसा कि मैंने पहले किया था, अलग-अलग शेड्यूलर वर्ग के कारण? यह भी संभव उपयोग में शामिल होता है
django-celery-beat
... दोनों में से किसी भी फ्रेमवर्क का उपयोग करना, यह अभी भी नौकरियों को कतारबद्ध करने के लिए संभव है। अभी थोड़े लंबे समय से चल रहे हैं लेकिन महीनों दूर नहीं हैं? ' - django-apscheduler , उपयोग करता है
apscheduler
। हालाँकि, मुझे इस बारे में कोई जानकारी नहीं मिल पा रही थी कि यह उन कार्यों को कैसे प्रबंधित करेगा जो सुदूर भविष्य में चलाए जाते हैं।
क्या जिस तरह से मैं यह आ रहा हूं, क्या कोई मौलिक दोष है? आप किसी भी इनपुट के लिए खुश हैं।
सूचना: मुझे पता है कि यह कुछ हद तक राय आधारित होने की संभावना है, हालांकि, शायद एक बहुत ही बुनियादी चीज है जो मुझे याद आती है, भले ही कुछ को बदसूरत या सुरुचिपूर्ण माना जा सकता है।