Запускать функцию, когда очередь задач в 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 минут, и это гарантирует, что когда данные будут кэшированы, они будут завершены.

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

Спасибо Как только все это закончится, мои данные не изменятся в течение следующих 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 минут, и это гарантирует, что когда данные будут кэшированы, они будут полными.

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

Спасибо Когда все это закончится, мои данные не изменятся в течение следующих 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 минут, и это гарантирует, что когда данные будут кэшированы, они будут завершены.

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

Спасибо

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

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

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

Спасибо

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

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

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

Спасибо

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

Спасибо

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

Спасибо Tom

5
задан tomcritchlow 5 April 2011 в 02:21
поделиться