http://github.com/arachnid/bulkupdate
とりあえず手順通りに試してみよう、と思ったら
handlers:
- url: /_ah/queue/deferred
script: $PYTHON_LIB/google/appengine/ext/deferred/handler.py
login: adminこれがkay-framework(http://code.google.com/p/kay-framework/)の
- url: /_ah/queue/deferred script: kay/main.py login: admin
とぶつかるじゃん。/_ah/queue/deferredって何かなと思ったらTask Queueだな。deferredの部分は任意らしい。というわけでurls.pyの/_ah/queue/deferredを/_ah/queue/kay_deferredに書き換えた。追記: Kayはkay/main.pyを指すことでkay.setup()が呼ばれることを保証しているので、このワークアラウンドではkayの中でdeferred.deferを呼んだ場合にkay.setup()が呼ばれていない状態で走ってトラブルが起きる、との指摘あり。 さらに追記: 変更しないでもkayのdeferredでbulkupdateが動くそうです!
def make_url(): return Map([ Rule('/_ah/queue/kay_deferred', endpoint='deferred'), Rule('/maintenance_page', endpoint='_internal/maintenance_page'), ])
app.yamlの方も同様に:
- url: /_ah/queue/kay_deferred script: kay/main.py login: admin
さて、僕はくり返しタスクじゃなくていいのだけど、UPDATE_INTERVAL = datetime.timedelta(days=1)の値は何にセットしたらいいのやら。0にしてがんがん繰り返されたらやだな。ドキュメントに書いてないなぁ。あれ、ソースコードにも出てこないぞ。
と思ったらhandle_entityの中でif (datetime.datetime.now() - entity.last_reset) > self.UPDATE_INTERVAL:って使ってるだけか。繰り返し実行のキック自体はこのライブラリが提供しているわけじゃないのね。
さて、ドキュメントに言われたとおりに書きまして、
http://localhost:8082/_ah/bulkupdate/admin/とかにアクセスすると
Bulk update job listing
No jobs.
と表示される。
さあ、Jobを開始してみよう。と思ったらPicklingError: Can't pickle

自動的に処理が行われないなぁと思ったら
Task Queues and the Development Server
When your app is running in the development server, task queues are not processed automatically.
http://code.google.com/appengine/docs/python/taskqueue/overview.html
ということらしい。

Runを押したらちゃんと処理が行われた。
本番サーバではAdmin Consoleのサイドバーの下のほうにリンクが出来る。ちゃんとできた。