Изпълнение на функция, когато опашката със задачи е празна в appengine

Имам задача cron всеки ден, за да направя повикване до API и да извлека някои данни. За всеки ред от данните стартирам опашка със задачи за обработка на данните (което включва търсене на данни чрез допълнителни API). След като всичко това приключи, моите данни не се променят през следващите 24 часа, така че ги кеширам.

Има ли начин да разбера кога всички задачи, които поставих на опашка, са приключили, за да мога да кеширам данните?

В момента го правя по наистина объркан начин, като просто планирам две задания на cron като това:

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 минути по-късно и това гарантира, че когато данните бъдат кеширани, те са завършени.

Има ли по-добър начин за кодиране на това? Чувствам, че моето решение не е най-доброто....

Благодаря Том


person tomcritchlow    schedule 05.04.2011    source източник


Отговори (2)


Понастоящем няма начин да определите кога вашите задачи са приключили изпълнението. Най-добрият ви вариант би бил да вмъкнете записи на маркери в хранилището за данни и всяка задача да изтрие своя запис, когато приключи. След това всяка задача може да провери дали е последната задача и да извърши вашето почистване/кеширане, ако е така.

person Nick Johnson    schedule 05.04.2011
comment
благодаря ник - радвам се да знам, че не съм пропуснал нещо очевидно. Ще пробвам каквото ми предложиш - person tomcritchlow; 05.04.2011

намерих този въпрос, докато се занимавах със същия проблем. измислих различно решение, което публикувам тук, в случай че е полезно за други.

това не е директен заместител на това, което питате, но е свързано - проблемът ми беше, че исках да знам кога опашката е празна, защото това означава, че сложен фонов процес е приключил. така че мога да заменя проверката на размера на опашката с проверка на "deadman timer"

времето за бездействие е таймер, който постоянно се нулира от някакъв процес. когато този процес приключи, таймерът не се нулира и в крайна сметка изтича. така че имах всички различни задачи, които формираха част от моя сложен фонов процес, да нулират таймера и вместо да проверява кога опашката е празна, имах cron задача, която проверяваше кога таймерът е изтекъл.

разбира се, за да бъде това ефективно, таймерът трябва да избягва да записва в хранилището на данни през цялото време. кодът на http://acooke.org/cute/Deadmantim0.html избягва това, като отпуска леко поведение и използване на memcache за задържане на копие на обекта на таймера и за нулирането му в магазина само след като е изминало значително време.

ps това е по-ефективно от това, което описвате, защото не е необходимо да пише толкова често в базата данни. освен това е по-здрав, защото не е нужно да следите точно какво се случва.

person andrew cooke    schedule 03.08.2011
comment
Освен това е по-малко стабилен, тъй като броячът може да изтече, защото всички изпълнявани задачи са твърде бавни. На практика това може да е достатъчно малко вероятно, предполагам. - person maaartinus; 19.07.2013