2013-01-16 12 views
6

यह एक अजगर सवाल हो सकता है। यह सुनिश्चित करने के लिए एक नोबिश है।django पूर्व-गणना और कैश एक दृश्य

एक ग्राहक एक गणना-गहन पृष्ठ [पृष्ठ -1] का अनुरोध करता है और आखिरकार दूसरी गणना-गहन पृष्ठ [पृष्ठ -2] का अनुरोध करेगा, जिसका उदाहरण गणना की जा सकती है उदाहरण के लिए पृष्ठ -1 के लिए अनुरोध ज्ञात है। मैं पृष्ठ -1 की सेवा करने से पहले डेटा के प्रत्येक सेट की गणना नहीं करना चाहता क्योंकि यह प्रारंभिक प्रतिक्रिया के प्रदर्शन को काफी धीमा कर देगा।

क्लाइंट पेज -1 के लिए मान की गणना करना चाहता है जबकि क्लाइंट पेज -1 पढ़ता है। ग्राहक कुछ बटनों पर भी क्लिक कर सकता है जो एक प्रतिक्रिया का कारण बनता है जो पृष्ठ -1 डेटा का एक अलग दृश्य प्रदान करता है, लेकिन गहन गणना की आवश्यकता नहीं है। आखिरकार, लेकिन जरूरी नहीं, ग्राहक पेज -2 के लिए पूछेगा और मैं पूर्व-प्रस्तुत प्रतिक्रिया के साथ प्रतिक्रिया करने में सक्षम होना चाहता हूं।

मैं यह कैसे कर सकता हूं?

+0

आप को गति प्रदान करना चाहते हैं पृष्ठ 1 जानकारी के आधार पर पृष्ठ 2 की गणना करने वाला एक एसिंक्रोनस फ़ंक्शन, इसे कैश (या कहीं भी) में संग्रहीत करें, फिर पृष्ठ 2 में: लगातार एक दृश्य को मतदान करें जो कैश में किसी निश्चित कुंजी की जांच करना जानता है ताकि यह निर्धारित किया जा सके कि पृष्ठभूमि कार्य कब समाप्त हुआ चरण 2 कार्य की गणना करना। –

+0

मुझे नहीं पता कि यह कैसे करना है। कोई भी छोटा मार्गदर्शन बहुत मदद करेगा। – Cole

+1

मुझे खेद है, मैं एक निबंध लिखने के बिना और अधिक जानकारी में नहीं जा सकता। मूल रूप से, जैसे ही क्लाइंट 1 पृष्ठ पढ़ता है, आपको इस महंगे फ़ंक्शन को ट्रिगर करने की आवश्यकता होती है। यदि आप नहीं चाहते हैं कि ग्राहक पृष्ठ लोड करने से पहले इसके लिए प्रतीक्षा करें, तो आपको नौकरी को अतुल्यकालिक बनाना होगा। एक पृष्ठभूमि कार्य। फिर, पृष्ठ 2 में, आपको संभावना है कि पृष्ठभूमि कार्य अभी तक पूरा नहीं हुआ है। इस प्रकार, आपके दूसरे पृष्ठ को बीजी कार्य पूरा होने तक सर्वर को लगातार मतदान करने की आवश्यकता होती है, जिस बिंदु पर आप अपने उपयोगकर्ता को पेज 2 दिखा सकते हैं। –

उत्तर

7

जैसा कि टिप्पणियों में बताया गया है, ऐसा लगता है कि आपको इसे Django low level cache में परिणाम सहेजने के लिए एक असीमित पृष्ठभूमि कार्य के साथ इसे संभालने की आवश्यकता होगी। मैं कार्य कतार के लिए व्यक्तिगत रूप से celery का उपयोग करता हूं।

मूल रूप से, पृष्ठ के अनुरोध के बाद, आप पेज 2 गणना शुरू करने के लिए एक असीमित कार्य जोड़ देंगे, परिणाम कैश में संग्रहित करेंगे। इसलिए, जब पृष्ठ 2 का अनुरोध किया जाता है, तो आप कैश में पूर्व-प्रस्तुत प्रतिक्रिया की जांच करते हैं, और यदि यह अस्तित्व में नहीं है, तो आप मान को समकालिक रूप से गणना कर सकते हैं।

तो, अपने कोड (कार्य अपने ऐप्लिकेशन में task.py फ़ाइल में होगा, लेकिन यह आप एक सामान्य विचार देना चाहिए) कुछ इस तरह दिखेगा:

from celery import task 
from django.core.cache import cache 

def page_two_calculation(arg1, arg2): 
    return arg1 + arg2 

@task 
def page_two_task(arg1, arg2): 
    result = page_two_calculation(arg1, arg2) 
    cache_key = "page-two-%s-%s" (arg1, arg2) 
    cache.set(cache_key, result) 

def page_one(request, arg1, arg2): 

    # Start the page two task 
    page_two_task.delay(arg1, arg2) 

    # Return the page one response 
    return HttpResponse('page one') 

def page_two(request, arg1, arg2) 
    cache_key = "page-two-%s-%s" (arg1, arg2) 
    result = cache.get(cache_key) 
    if result is None: 
     # the result will only be None if the page 2 calculation 
     # doesn't exist in the cache, in which case we'll have to 
     # return the value synchronously. 
     result = page_two_calculation(arg1, arg2) 
    return result 
संबंधित मुद्दे