मुझे डेटाबेस और मेमकैच के लिए डीजेगो चलाने वाली पाइथन स्क्रिप्ट मिली है, लेकिन यह विशेष रूप से स्टैंडअलोन डिमन के रूप में चल रहा है (यानी वेबसर्वर अनुरोधों का जवाब नहीं दे रहा है)। डिमन status=STATUS_NEW
के साथ ऑब्जेक्ट्स के लिए एक Django मॉडल अनुरोध की जांच करता है, फिर उन्हें STATUS_WORKING चिह्नित करता है और उन्हें कतार में रखता है।डेटाबेस के पायथन/डीजेगो मतदान में मेमोरी लीक
कई प्रक्रियाएं (मल्टीप्रोसेस पैकेज का उपयोग करके बनाई गई) चीजों को कतार से बाहर खींचती हैं और pr.id
के साथ अनुरोध पर काम करती हैं जो कि कतार में पारित की गई थी। मेरा मानना है कि स्मृति रिसाव शायद निम्न कोड में है (लेकिन यह कतार के दूसरी तरफ 'वर्कर' कोड में हो सकता है, हालांकि यह असंभव है क्योंकि स्मृति आवश्यकता तब भी बढ़ रही है जब कोई आवश्यकता नहीं आती है - यानी जब कर्मचारी सभी Queue.get() पर अवरुद्ध कर रहे हैं)।
from requisitions.models import Requisition # our Django model
from multiprocessing import Queue
while True:
# Wait for "N"ew requisitions, then pop them into the queue.
for pr in Requisition.objects.all().filter(status=Requisition.STATUS_NEW):
pr.set_status(pr.STATUS_WORKING)
pr.save()
queue.put(pr.id)
time.sleep(settings.DAEMON_POLL_WAIT)
जहां settings.DAEMON_POLL_WAIT=0.01
।
ऐसा लगता है कि अगर मैं इसे कुछ समय के लिए चला रहा हूं (यानी दो दिन) पाइथन प्रक्रिया अनंत आकार तक बढ़ेगी और अंत में सिस्टम स्मृति से बाहर हो जाएगा।
यहां क्या हो रहा है (या मैं कैसे पता लगा सकता हूं), और सबसे महत्वपूर्ण बात यह है कि आप एक डिमन कैसे चला सकते हैं?
मेरी पहली सोचा समारोह के गतिशील बदलने के लिए, विशेष रूप से
from django.core.cache import cache
while True:
time.sleep(settings.DAEMON_POLL_WAIT)
if cache.get('new_requisitions'):
# Possible race condition
cache.clear()
process_new_requisitions(queue)
def process_new_requisitions(queue):
for pr in Requisition.objects.all().filter(status=Requisition.STATUS_NEW):
pr.set_status(pr.STATUS_WORKING)
pr.save()
queue.put(pr.id)
प्रक्रिया है कि status=STATUS_NEW
साथ Requisitions बनाने है एक cache.set('new_requisitions', 1)
कर सकते हैं एक django.core.cache cache
में नई मांग के लिए चेक वस्तुओं डाल, यानी कर रहा है (या वैकल्पिक रूप से हम एक सिग्नल या Requisition.save() ईवेंट पकड़ सकते हैं जहां एक नया अनुरोध बनाया जा रहा है और फिर वहां से कैश में ध्वज सेट करें)।
हालांकि मुझे यकीन नहीं है कि मैंने जिस समाधान का प्रस्ताव दिया है, वह स्मृति समस्याओं को संबोधित करता है (जो शायद कचरा संग्रह से संबंधित हैं - इसलिए process_new_requisitions
के माध्यम से स्कॉइंग समस्या को हल कर सकता है)।
मैं किसी भी विचार और प्रतिक्रिया के लिए आभारी हूं।
बस एक सोचा ... आप डीबग = settings.py में सच के साथ चल रहे हैं? डीबग मोड सभी प्रश्नों को बचाता है, जो निश्चित रूप से मेमोरी लीक की तरह दिख सकते हैं :) –
हे हे। मैं वास्तव में था! मैं उसके बारे में भूल गया। मैंने इसे बंद कर दिया है (और कैश समाधान में स्थानांतरित हो गया है) और स्मृति रिसाव कम हो गया है। –