Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

GAEのcron

http://d.hatena.ne.jp/nishiohirokazu/20090308/1236495788
んーっと。
まあ現状だとurlfetchでまわすしかないよね。
適当な擬似コード

@expose('/admin/cronstart/')
def start(req):
    if not memcache.get('start'):
        memcache.set('start', 1)
        return redirect('/crond/')
    return Response("cron started")

@expose('/admin/cronstop/')
def stop(req):
    memcache.delete('start')
    return redirect('/')

@expose('/crond/')
def task(req):
    if memcache.get('start'):
        #check
        #cron.Cron()
        get_url('/sleep/')
    return Response("", mimetype="text/html")

@expose('/sleep/')
def sleep(req):
    time.sleep(10)
    get_url('/crond/')
    return Response("", mimetype="text/html")

def get_url(url):
    try:
        if not url.startswith('/'):
            url = '/' + url
        url = 'http://' + str(os.environ['HTTP_HOST']) + url
        urlfetch.fetch(url)
    except Exception, e:
        pass

一応、本番環境でも怒られずにぐるぐると回るよ。
すでにスケジューラーappはいくつか存在してるし。
ぐるぐる回るので時間のチェックにmemcached使ってもいいし時間で見てもいいかなー。
追記
urlfetchでタイムアウトは必ず発生するのでtry...exceptしておく部分を追記