2011-04-05 33 views
5

Bir API'ye çağrı yapmak ve bazı verileri almak için her gün bir cron işim var. Verilerin her satırı için verileri işlemek için bir görev kuyruğuna basıyorum (veriyi diğer API'ler aracılığıyla aramakla ilgilidir). Tüm bunlar bittiğinde, sonraki 24 saat boyunca verilerim değişmez, bu yüzden onu not aldım.Görev kuyruğu appien'de boşken çalıştır işlevi

Verileri önbelleğe alabilmem için sıraya aldığım tüm görevlerin ne zaman tamamlandığını öğrenmenin bir yolu var mı?

Şu anda sadece bu gibi iki cron işleri planlayarak gerçekten dağınık biçimde bunu:

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) 

Sonra cron.yaml şöyle görünür: Temelde

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

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

- Ben Tüm görevlerimin çalıştırılmasının 5 dakikadan fazla sürmeyeceğini tahmin ediyorum, bu yüzden önbellek 5 dakika sonra akıtır ve bu veriler önbelleğe alındığında tamamlanır.

Bunu kodlamanın daha iyi bir yolu var mı? Benim çözümün en iyi çözüm değil gibi geliyor ....

Teşekkür Tom

cevap

6

anda görevleri yürütme bittiğinde belirlemek için herhangi bir yolu yok. En iyi seçeneğiniz, veri deposuna işaretçi kayıtları eklemek ve bittiğinde her görevin kaydını silmektir. Her görev, son görev olup olmadığını kontrol edebilir ve eğer varsa temizleme/önbelleğe alma işlemini gerçekleştirebilir. Aynı sorunla uğraşırken bu soruyu buldum

+0

teşekkürler nick - bariz bir şey kaçırmadım bilmek güzel. Ne önerdiğinizi deneyeceğim – tomcritchlow

2

. Başkalarına faydalı olması durumunda burada yayınladığım farklı bir çözüm buldum.

bu sizin sorduğunuz şey için doğrudan bir değiştirmedir, ancak ilişkilidir - benim sorunum, bir sıranın ne zaman boş olduğunu bilmek istedim çünkü bu, karmaşık bir arka plan işleminin çalışmayı bitirdiği anlamına geliyordu. Bu nedenle, bir "deadman zamanlayıcısı" kontrol ederek kuyruk boyutunu kontrol etmenin yerini tutabiliyordum, bir deadman zamanı, bir süreç tarafından sürekli olarak sıfırlanan bir zamanlayıcıdır. Bu işlem bittiğinde, zamanlayıcı sıfırlanmaz ve sonunda sona erer. Bu yüzden, karmaşık arka plan sürecimin bir parçasını oluşturan tüm farklı görevleri zamanlayıcıyı sıfırladım ve sıra boş olduğunda ne zaman kontrol ettiğimi görmek yerine, zamanlayıcının süresi dolduğunda kontrol edilen bir cron işi vardı. Tabii ki, bunun verimli olması için, zamanlayıcının her zaman veri deposuna yazılmasını engellemek zorundadır. http://acooke.org/cute/Deadmantim0.html'daki kod, bu davranışı hafifçe gevşeterek ve zamanlayıcı nesnesinin bir kopyasını tutmak için memcache'yi kullanarak ve yalnızca önemli miktarda zaman geçtikten sonra mağazada sıfırlamak suretiyle önler.

ps Bu, açıkladığınızdan daha etkilidir çünkü veritabanına sık sık yazılması gerekmez. Aynı zamanda daha sağlamdır, çünkü neler olduğunu tam olarak takip etmenize gerek yoktur.

+0

Ayrıca, çalışan tüm görevler çok yavaş olduğu için sayacın zaman aşımına uğraması da daha az dayanıklıdır. Pratikte bu yeterince olanaksız olabilir, sanırım. – maaartinus