bulkupdateを使う

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 : it's not found as main.views.ToMultiAnswer。あー。pickleするのか。一時的に使うタスクをトップレベルにおくのが嫌で関数の中に置いたから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のサイドバーの下のほうにリンクが出来る。ちゃんとできた。