Запустить функцию, когда очередь задач пуста в appengine - PullRequest
5 голосов
/ 05 апреля 2011

У меня есть ежедневная работа 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 минут, и это гарантирует, что когда данные будут кэшированы, они завершатся.

Есть ли лучший способ кодирования этого?Чувствуется, что мое решение не лучшее ...

Спасибо, Том

Ответы [ 2 ]

6 голосов
/ 05 апреля 2011

В настоящее время нет никакого способа определить, когда ваши задачи закончили выполняться. Лучшим вариантом будет вставить записи маркеров в хранилище данных, и каждая задача удалит свою запись по завершении. Затем каждая задача может проверить, является ли она последней, и выполнить очистку / кэширование, если оно есть.

2 голосов
/ 03 августа 2011

я нашел этот вопрос, имея дело с той же проблемой. я придумала другое решение, которое я публикую здесь на случай, если оно пригодится другим.

это не прямая замена того, что вы просите, но это связано - моя проблема заключалась в том, что я хотел знать, когда очередь пуста, потому что это означает, что сложный фоновый процесс завершился. так что я мог бы заменить проверку размера очереди проверкой «таймера мертвецов»

Мертвое время - это таймер, который постоянно сбрасывается каким-либо процессом. когда этот процесс завершается, таймер не сбрасывается и в конце концов истекает. поэтому все различные задачи, которые составляли часть моего сложного фонового процесса, сбрасывали таймер, и вместо проверки, когда очередь была пуста, у меня было задание cron, которое проверялось, когда истекал таймер.

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

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

...