Posted on 03 January, 2012

/_ah/start での処理に時間がかかると本来のURLでのcronが実行されない。instanceの立ち上げで数十秒かかる場合などはよくあるので困る。


1分前にダミーのcronを走らせておいてwarmupしておくのが得策かもしれない。


cron.yaml

cron:
- description: main
  url: /main-job
  schedule: every 1 hours synchronized
  timezone: Asia/Tokyo
  target: backend
- description: main-warmup
  url: /dummy
  schedule: every 1 hours from 00:59 to 23:59
  timezone: Asia/Tokyo
  target: backend

Posted on 12 November, 2011

WARNING:root:The HTTP_HOST environment variable was not set, but is required to determine the correct value for the `Task.target’ property. Please update your unit tests to specify a correct value for this environment variable.



以下の記述を追加したらWarningが出なくなった。


import os
os.environ['HTTP_HOST'] = 'localhost:8000'

何の意味があるのかは知らない。

Posted on 17 September, 2011

App Engine のリソース管理 – TaskQueue の設定



これらの応用として、時間によって Task を積む queue を変更すると、例えば夜間のみ Backends で Task を実行し、昼間は Frontend instance で Task を実行するなどのことが結構簡単にできます。



どうやるの?(´・ω・`)


Background work with the deferred library



deferred.defer(do_something_expensive, "Foobie bletch", 12, _countdown=30, _queue="myqueue")


あー、_queueって引数で指定するのね。


queue.yaml


queue:
- name: myqueue1
  rate: 5/s
  target: backend
- name: myqueue2
  rate: 5/s
  max_concurrent_requests: 1

で、時間で変えると。


if 0 <= hour < 12:
  deferred.defer(do_something, 'Good morning.', _queue='myqueue1')
else:
  deferred.defer(do_something, 'Good evening.', _queue='myqueue2')

追記


Cronから直接呼べるらしいぞ。知らなかった恥ずかしい。

Posted on 30 March, 2011

昨日ここが404になってて何だろうなーと思ってログを見たのですが、TaskAlreadyExistsErrorとかTombstonedTaskErrorとかTransientErrorとかで溢れていました。Task Queueにまつわるエラーだそうで、例外が発生するとTask Queueは再度実行されるので、延々とエラーが続いている状態でした。それはわかったけど、何も404にしなくても…。


blog/post_deploy.py の 13 行目を直します。

-from google.appengine.api.labs import taskqueue
+from google.appengine.api import taskqueue

Posted on 05 March, 2011

ZIPのアップローダーを作った時に悩んだ箇所です。


from werkzeug import BaseResponse, Client
from kay.app import get_application
from kay.ext.testutils.gae_test_base import GAETestBase
from StringIO import StringIO

class HogeTest(GAETestBase): def setUp(self): app = get_application() self.client = Client(app, BaseResponse)

def test_file_upload(self): response = self.client.open( path='/', method='POST', data={ 'foo': 'bar', 'file': (StringIO('hogehoge'), 'filename.txt'), }, content_type='multipart/form-data' ) self.assertEquals(response.status_code, 200)

みたいな感じでうまくいきました。


ZIPの場合はバイナリデータなので、base64エンコードしてソースにベタ書きしておいてbase64デコードしたものをStringIOの引数に入れてやっています。


ものによってはZIPが壊れるんだけど原因はわかりません。