2011-04-05 13 views
5

पर कार्य कतार खाली होने पर कार्य चलाएं मेरे पास एक एपीआई को कॉल करने और कुछ डेटा लाने के लिए हर रोज क्रॉन नौकरी होती है। डेटा की प्रत्येक पंक्ति के लिए मैं डेटा को संसाधित करने के लिए एक कार्य कतार निकाल देता हूं (जिसमें आगे के एपीआई के माध्यम से डेटा देखना शामिल है)। एक बार यह सब खत्म हो जाने पर मेरा डेटा अगले 24 घंटों तक नहीं बदलता है, इसलिए मैं इसे याद करता हूं।एपेंगिन

क्या यह जानने का कोई तरीका है कि जब मैंने कतारबद्ध किए गए सभी कार्यों को समाप्त कर दिया है ताकि मैं डेटा कैश कर सकूं?

वर्तमान में मैं सिर्फ इस तरह दो क्रॉन नौकरियों शेड्यूल करके एक वास्तव में गन्दा फैशन में कार्य करें:

class fetchdata(webapp.RequestHandler): 
def get(self): 
    todaykey = str(date.today()) 
    memcache.delete(todaykey) 
    topsyurl = 'http://otter.topsy.com/search.json?q=site:open.spotify.com/album&window=d&perpage=20' 
    f = urllib.urlopen(topsyurl) 
    response = f.read() 
    f.close() 

    d = simplejson.loads(response) 
    albums = d['response']['list'] 
    for album in albums: 
     taskqueue.add(url='/spotifyapi/', params={'url':album['url'], 'score':album['score']}) 

class flushcache(webapp.RequestHandler): 
    def get(self): 
     todaykey = str(date.today()) 
     memcache.delete(todaykey) 

तब मेरे cron.yaml इस तरह दिखता है:

- description: gettopsy 
    url: /fetchdata/ 
    schedule: every day 01:00 
    timezone: Europe/London 

- description: flushcache 
    url: /flushcache/ 
    schedule: every day 01:05 
    timezone: Europe/London 

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

क्या यह कोडिंग का एक बेहतर तरीका है? लगता है जैसे मेरी समाधान सबसे अच्छा एक नहीं है ....

धन्यवाद टॉम

उत्तर

6

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

+0

धन्यवाद निक - मुझे पता है कि मुझे कुछ स्पष्ट याद नहीं आया। मैं कोशिश करता हूं कि आप – tomcritchlow

2

मुझे एक ही मुद्दे से निपटने के दौरान यह प्रश्न मिला। मैं एक अलग समाधान के साथ आया जो मैं दूसरों के लिए उपयोगी होने पर यहां पोस्ट कर रहा हूं।

यह आप जो पूछ रहे हैं उसके लिए यह प्रत्यक्ष प्रतिस्थापन नहीं है, लेकिन यह संबंधित है - मेरी समस्या यह थी कि मैं जानना चाहता था कि एक कतार खाली कब थी क्योंकि इसका मतलब है कि एक जटिल पृष्ठभूमि प्रक्रिया समाप्त हो गई थी। इसलिए मैं "डेडमैन टाइमर" की जांच के साथ कतार आकार की जांच कर सकता हूं

एक मृतक समय एक टाइमर है जो लगातार कुछ प्रक्रिया द्वारा रीसेट किया जाता है। जब वह प्रक्रिया समाप्त होती है तो टाइमर रीसेट नहीं होता है और अंततः समाप्त हो जाता है। इसलिए मेरे पास सभी जटिल कार्य थे जो मेरी जटिल पृष्ठभूमि प्रक्रिया का हिस्सा बनते थे टाइमर को रीसेट करते हैं और कतार खाली होने पर जांचने के बजाय, मेरे पास एक क्रॉन जॉब था जो टाइमर की समयसीमा समाप्त होने पर जांच करता था।

बेशक, यह कुशल होने के लिए, टाइमर को हर समय डेटा स्टोर में लिखने से बचना होता है। http://acooke.org/cute/Deadmantim0.html पर कोड थोड़ा सा व्यवहार आराम करके और टाइमर ऑब्जेक्ट की प्रतिलिपि रखने के लिए मेमकेचे का उपयोग करके और इसे केवल पर्याप्त समय के बाद स्टोर में रीसेट करने से बचाता है।

ps यह आपके द्वारा वर्णित की तुलना में अधिक कुशल है क्योंकि इसे अक्सर डेटाबेस में लिखने की आवश्यकता नहीं होती है। यह भी अधिक मजबूत है क्योंकि आपको क्या हो रहा है इसके बारे में बिल्कुल ट्रैक रखना नहीं है।

+0

का सुझाव देते हैं और यह भी कम मजबूत है क्योंकि काउंटर समाप्त हो सकता है क्योंकि सभी चल रहे कार्यों में बहुत धीमी गति होती है। अभ्यास में यह असंभव हो सकता है, मुझे लगता है। – maaartinus

संबंधित मुद्दे