5

私は毎日、API を呼び出してデータを取得する cron ジョブを実行しています。データの行ごとに、タスク キューを開始してデータを処理します (さらに API を介してデータを検索する必要があります)。これがすべて完了すると、データは次の 24 時間は変更されないので、memcache します。

データをキャッシュできるように、キューに入れていたすべてのタスクがいつ終了したかを知る方法はありますか?

現在、次のように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 分後にキャッシュをフラッシュするだけで、データがキャッシュされたときに完全に完了することが保証されます。

これをコーディングするより良い方法はありますか?私の解決策は最善の解決策ではないように感じます....

ありがとうトム

4

2 に答える 2

6

現在、タスクの実行がいつ終了したかを判断する方法はありません。最良のオプションは、マーカー レコードをデータストアに挿入し、各タスクが完了したらそのレコードを削除することです。各タスクは、それが最後のタスクであるかどうかを確認し、最後のタスクである場合はクリーンアップ/キャッシュを実行できます。

于 2011-04-05T03:16:16.877 に答える
2

同じ問題を扱っているときにこの質問を見つけました。他の人に役立つ場合に備えて、ここに投稿している別の解決策を思いつきました。

これはあなたが求めていることの直接の代替ではありませんが、関連しています-私の問題は、複雑なバックグラウンドプロセスの実行が終了したことを意味するため、キューが空になったことを知りたいということでした. そのため、キューサイズのチェックを「デッドマンタイマー」のチェックに置き換えることができます

デッドマン時間は、何らかのプロセスによって常にリセットされるタイマーです。そのプロセスが終了すると、タイマーはリセットされず、最終的に期限切れになります。そのため、複雑なバックグラウンド プロセスの一部を形成するさまざまなタスクすべてにタイマーをリセットさせ、キューが空になったことを確認する代わりに、タイマーの期限が切れたことを確認する cron ジョブを用意しました。

もちろん、これが効率的であるためには、タイマーは常にデータ ストアへの書き込みを回避する必要があります。http://acooke.org/cute/Deadmantim0.htmlのコードでは、動作を少し緩和し、memcache を使用してタイマー オブジェクトのコピーを保持し、かなりの時間が経過した後にのみストアでリセットすることで、これを回避しています。 .

psデータベースに頻繁に書き込む必要がないため、これはあなたが説明したものよりも効率的です。また、何が起こっているかを正確に追跡する必要がないため、より堅牢です。

于 2011-08-03T00:57:42.903 に答える