2011-04-05 76 views
5

我每天都有一個cron作業來調用API並獲取一些數據。對於每行數據,我啓動一個任務隊列來處理數據(包括通過其他API查找數據)。一旦所有這些都完成了,我的數據在接下來的24小時內不會改變,所以我memcache它。當appengine上的任務隊列爲空時運行函數

有沒有辦法知道我排隊的所有任務何時完成,以便可以緩存數據?

目前我做一個真正的時尚凌亂通過只安排2個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分鐘後刷新緩存,這確保了數據緩存完成。

有沒有更好的編碼方式?感覺就像我的解決方案是不是最好的....

感謝 湯姆

回答

6

有當前沒有任何的方法來確定當你的任務已經執行完畢。您最好的選擇是在數據存儲中插入標記記錄,並在完成後讓每個任務刪除記錄。然後每個任務都可以檢查它是否是最後一項任務,並且如果是的話就執行清理/緩存。

+0

謝謝尼克 - 很高興知道我沒有錯過任何明顯的事情。我會嘗試你的建議 – tomcritchlow 2011-04-05 03:36:32

2

我在處理同一問題時發現此問題。我想出了一個不同的解決方案,我在這裏發佈信息以防其他人使用。

這不是直接取代你所問的,而是相關的 - 我的問題是我想知道隊列是空的,因爲這意味着一個複雜的後臺進程已經完成運行。所以我可以通過檢查「deadman timer」來替換檢查隊列大小

deadman time是一個計時器,它不斷地被某個進程重置。當該過程完成時,定時器不會重置並最終到期。所以我有所有不同的任務,形成我的複雜後臺進程的一部分重置計時器,而不是檢查隊列是否爲空時,我有一個計時器過期時檢查的cron作業。

當然,爲了高效,定時器必須避免一直寫入數據存儲區。 http://acooke.org/cute/Deadmantim0.html的代碼通過略微放寬行爲並使用memcache來保存計時器對象的副本並在經過大量時間後纔將其重置在存儲中來避免此問題。

ps這比你描述的更有效率,因爲它不需要經常寫入數據庫。它也更強大,因爲您不必精確追蹤發生的情況。

+0

它也不太健壯,因爲計數器可能會因所有運行任務太慢而失效。實際上,這可能不太可能,我想。 – maaartinus 2013-07-19 13:38:54

相關問題