トップページ> "> Webサービス "> GoogleAppEngine

GAE/Pタスクキューで実行頻度の設定と、無限リトライ防止

defaultタスクキューに処理を登録

from google.appengine.api.labs import taskqueue

taskqueue.add(url='/job, params={'param1': "batch", 'mode': 'change' })

 /jobにparam1とmodeという変数をPostして処理させる。これが基本形。

タスクキューの無限リトライを防止

from google.appengine.api.labs import taskqueue
import logging

class Job(webapp.RequestHandler):
            
        
    def post(self):
       
        if( int(self.request.headers.environ['HTTP_X_APPENGINE_TASKRETRYCOUNT']) > 3):
            logging.error('jog retry error(over 3 times)')
            return

  ...処理を記述

 太字部分を追加すると、3回リトライしてダメだったらエラーログを残して処理を終了する。

デフォルト以外の設定でタスクを処理

 デフォルト以外のキューを設定すると、実行頻度とか、一度に実行するタスクの数を変えられる。

queue.yamlに以下のように設定

queue:
- name: task_per_minute
  rate: 1/m
  bucket_size: 1
- name: speed_queue
  rate: 5/s

 rateの1/mは一分あたり一回実行の意味。5/sは秒あたり5回実行。bucket_sizeは、一度に並列処理する数。1だとひとつひとつ処理するようだ。 5/hと書いて、だいたい12分間隔で実行してくれるのかは未確認。

 上記のように設定した、default以外のキューにタスクを投入するときはこう書く。

from google.appengine.api.labs import taskqueue

mytask = taskqueue.Queue('task_per_minute')

task = taskqueue.Task(url='/job, params={'param1': "batch", 'mode': 'change' })
mytask .add(task)

 追記)上記の方法だと、「リトライエラー」が無限に発生する、という自体に陥ることがあった。色々調べた結果、queue.yamlにリトライ回数を記述するのが確実なようだ。

queue:
- name: task_per_minute
  rate: 1/m
  bucket_size: 1
  retry_parameters:
    task_retry_limit: 3
- name: speed_queue
  rate: 5/s 
  retry_parameters:
    task_retry_limit: 3

 retry_parametersのtask_retry_limitが最大リトライ数。

 その他のパラメータについては、googleの公式ページを参照。

 google公式ページ queue設定方法: python task queue configuration - google app engine  

  はてなブックマーク - GAE/Pタスクキューで実行頻度の設定と、無限リトライ防止 この記事にTwitterでつぶやく このページをはてなブックマーク
次のGoogleAppEngineのインスタンス設定を最低限にして、課金額をゼロにする or 最低限に抑えるへ
トップページ> "> Webサービス "> GoogleAppEngine もくじ